#wpf
#wpf
Вопрос:
Здравствуйте, я хочу изменить цвет пакета фильтров при фильтрации данных из данных GridView
. Мой GridView
дизайн такой:-
Я хочу изменить цвет значка фильтра при нажатии кнопки применить фильтр и удалить цвет при нажатии кнопки удалить.
XML-код для GridViewColumnHeader
:-
<DataGrid HorizontalAlignment="Left" Height="975" VerticalAlignment="Top" Width="1894" AlternationCount="2" AutoGenerateColumns="False"
ItemsSource="{Binding Products}" SelectedItem="{Binding IsSelected}" x:Name="dataGrid" Margin="10,75,-1144,0">
<DataGrid.Resources>
<Style TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="HorizontalContentAlignment" Value="Center" />
<Setter Property="HorizontalAlignment" Value="Stretch"/>
<Setter Property="Height" Value="50" />
<Setter Property="SeparatorBrush" Value="DarkRed" />
<Setter Property="FontWeight" Value="Black" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
<Grid>
<Border x:Name="columnHeaderBorder"
BorderThickness="1"
Padding="3,0,3,0">
<Border.BorderBrush>
<LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
<GradientStop Offset="0" Color="#ecebf2" />
<GradientStop Offset="1" Color="#ecebf2" />
</LinearGradientBrush>
</Border.BorderBrush>
<Border.Background>
<LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
<GradientStop Offset="0" Color="#575757" />
<GradientStop Offset="1" Color="#575757" />
</LinearGradientBrush>
</Border.Background>
<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
</Border>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<StackPanel Orientation="Horizontal" Visibility="Visible" Background ="Transparent" >
<TextBlock Text="{Binding}" Style="{StaticResource MaterialDesignCaptionTextBlock}" Foreground="White" Background="Transparent" HorizontalAlignment="Center" Margin="0,5" >
</TextBlock>
<Button x:Name="btnfilter" Command="{ Binding ApplyFilterCommand}" Click="Btnfilter_Click" HorizontalContentAlignment="Right"
HorizontalAlignment="Right" BorderBrush="Transparent" Background="Transparent" Margin="0,-2" >
<materialDesign:PackIcon x:Name="FilterIcon" Kind="Filter" Foreground="White" BorderThickness="0" BorderBrush="Transparent" HorizontalContentAlignment="Right" VerticalAlignment="Center">
<materialDesign:PackIcon.Style>
<Style TargetType="materialDesign:PackIcon" >
<Style.Triggers>
<DataTrigger Binding="{Binding Boolfilteractivate}">
<Setter Property="Foreground" Value="Black">
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</materialDesign:PackIcon.Style>
</materialDesign:PackIcon>
</Button>
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</DataGrid.Resources>
Это общий шаблон для всех GridViewColumnHeader
.
Пожалуйста, предложите, как изменить цвет filtericon для определенного столбца.
ВСПЛЫВАЮЩИЙ код для заголовка столбца:-
<Popup x:Name="popExcel" Width="300" Height="300" Placement="Bottom" StaysOpen="False">
<Border Background="White" BorderBrush="Gray" >
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TextBox x:Name="tbfilter" BorderBrush="Gray" Text="" Foreground="Black" BorderThickness="3" Height="30" Grid.Row="0" Margin="10" TextChanged="Tbfilter_TextChanged" KeyDown="Tbfilter_KeyDown"></TextBox>
<Separator Grid.Row="0" VerticalAlignment="Bottom" Margin="10,0" Height="3"/>
<ListBox x:Name="lbfilter" BorderBrush="Black" BorderThickness="0" Grid.Row="1" Margin="10">
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="IsSelected" Value="{Binding IsSelected}"/>
</Style>
</ListBox.ItemContainerStyle>
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox Style="{StaticResource MaterialDesignAccentCheckBox}" Background="Gray"
IsChecked="{Binding Is_Check, UpdateSourceTrigger=PropertyChanged}" Content="{Binding Title}"></CheckBox>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<Button x:Name="ApplyFilter" Style="{StaticResource MaterialDesignRaisedButton}" Foreground="White" Command="{Binding ApplyFilterCommand }" Background="#575757" Click="ApplyFilter_Click" Grid.Row="2" Margin="10">Apply Filter</Button>
<Button x:Name="ClearFilter" Style="{StaticResource MaterialDesignRaisedButton}" Foreground="White" Background="#575757" Click="ClearFilter_Click" Grid.Row="3" Margin="10">Remove Filter</Button>
</Grid>
</Border>
</Popup>
Как мы можем вызвать packicon как дочерний элемент кнопки
, например:-
string colName = "";
Button btn = sender as Button;
ObservableCollection<FilterObj> fltcurrent;
popExcel.PlacementTarget = btn;
StackPanel sp = btn.Parent as StackPanel;
foreach(var ch in sp.Children)
{
if(ch is TextBlock tb)
{
colName = tb.Text;
break;
}
}
foreach (var ch in sp.Children)
{
if (ch is Button bb)
{
}
Потому что я не могу вызвать packicon по имени:-
Пожалуйста, помогите
Комментарии:
1. Может быть, вам нужно установить цвет переднего плана значка?
2. @ Efthymios Kalyviotis, это правильно, но как вызвать его в файле xaml.cs.
3. @SubrataMitra В виртуальной машине для этих данных фильтра вы можете добавить логическое значение, которое сохраняется, когда фильтр применяется или нет, а затем добавить
DataTrigger
привязку к этому bool.4. @ Efthymios Kalyviotis, я пытаюсь с soulution, но никакого эффекта. Я публикую весь код xml и cs для лучшего понимания.
Ответ №1:
Я нахожу альтернативное решение:-
Вот код:-
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<StackPanel Orientation="Horizontal" Visibility="Visible" Background ="Transparent" >
<TextBlock Text="{Binding}" Style="{StaticResource MaterialDesignCaptionTextBlock}" Foreground="White" Background="Transparent" HorizontalAlignment="Center" Margin="0,5" >
</TextBlock>
<Button x:Name="btnfilter" Click="Btnfilter_Click" HorizontalContentAlignment="Right"
HorizontalAlignment="Right" BorderBrush="Transparent" Background="Transparent" Margin="0,-2" >
<materialDesign:PackIcon x:Name="FilterIcon" Kind="Filter" Foreground="White" BorderThickness="0" BorderBrush="Transparent" HorizontalContentAlignment="Right" VerticalAlignment="Center">
</materialDesign:PackIcon>
</Button>
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
Также необходимо добавить некоторый код в файл CS.
PackIcon wantedchild;
IList<PackIcon> wantedchilds = new List<PackIcon>();
Button button = sender as Button;
object wantedNode = button.FindName("FilterIcon");
if (wantedNode is PackIcon)
{
wantedchild = wantedNode as PackIcon;
wantedchilds.Add(wantedchild);
}
Добавить код кнопки: -`
foreach(var child in wantedchilds)
{
child.Foreground = Brushes.Blue;
} `
Удалить код кнопки:-
foreach (var child in wantedchilds)
{
child.Foreground = Brushes.White;
}
wantedchilds.Clear();