gpt4 book ai didi

c# - 修改 WPF 工具包 DropDownButton 样式

转载 作者:太空狗 更新时间:2023-10-29 21:54:12 25 4
gpt4 key购买 nike

我正在尝试修改 WpfToolkit 的 DropDownButton 样式以允许我设置背景颜色。

这是 DropDownButton 的默认样式:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:chrome="clr-namespace:Xceed.Wpf.Toolkit.Chromes"
xmlns:conv="clr-namespace:Xceed.Wpf.Toolkit.Core.Converters"
xmlns:local="clr-namespace:Xceed.Wpf.Toolkit">

<conv:InverseBoolConverter x:Key="InverseBoolConverter" />

<LinearGradientBrush x:Key="PopupDarkBorderBrush" EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FFA3AEB9" Offset="0" />
<GradientStop Color="#FF8399A9" Offset="0.375" />
<GradientStop Color="#FF718597" Offset="0.375" />
<GradientStop Color="#FF617584" Offset="1" />
</LinearGradientBrush>

<LinearGradientBrush x:Key="PopupBackgroundBrush" StartPoint="0,0" EndPoint="0,1">
<LinearGradientBrush.GradientStops>
<GradientStopCollection>
<GradientStop Offset="0" Color="#FFffffff" />
<GradientStop Offset="1" Color="#FFE8EBED" />
</GradientStopCollection>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>

<Style TargetType="{x:Type local:DropDownButton}">
<Setter Property="BorderThickness" Value="1" />
<Setter Property="IsTabStop" Value="False" />
<Setter Property="HorizontalContentAlignment" Value="Center" />
<Setter Property="VerticalContentAlignment" Value="Center" />
<Setter Property="Padding" Value="3" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:DropDownButton}">
<Grid x:Name="MainGrid" SnapsToDevicePixels="True">
<ToggleButton x:Name="PART_DropDownButton"
Grid.Column="1"
IsChecked="{Binding IsOpen, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}"
IsHitTestVisible="{Binding IsOpen, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource InverseBoolConverter}}">
<ToggleButton.Template>
<ControlTemplate TargetType="ToggleButton">
<ContentPresenter />
</ControlTemplate>
</ToggleButton.Template>
<Grid>
<chrome:ButtonChrome x:Name="ToggleButtonChrome"
CornerRadius="2.75"
RenderChecked="{TemplateBinding IsOpen}"
RenderEnabled="{TemplateBinding IsEnabled}"
RenderMouseOver="{Binding IsMouseOver, ElementName=PART_DropDownButton}"
RenderPressed="{Binding IsPressed, ElementName=PART_DropDownButton}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<ContentPresenter Margin="{TemplateBinding Padding}" Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" RecognizesAccessKey="true" />
<Grid x:Name="arrowGlyph" IsHitTestVisible="False" Margin="4,3,4,3" Grid.Column="1">
<Path x:Name="Arrow" Width="7" Height="4" Data="M 0,1 C0,1 0,0 0,0 0,0 3,0 3,0 3,0 3,1 3,1 3,1 4,1 4,1 4,1 4,0 4,0 4,0 7,0 7,0 7,0 7,1 7,1 7,1 6,1 6,1 6,1 6,2 6,2 6,2 5,2 5,2 5,2 5,3 5,3 5,3 4,3 4,3 4,3 4,4 4,4 4,4 3,4 3,4 3,4 3,3 3,3 3,3 2,3 2,3 2,3 2,2 2,2 2,2 1,2 1,2 1,2 1,1 1,1 1,1 0,1 0,1 z" Fill="#FF000000" />
</Grid>
</Grid>
</chrome:ButtonChrome>
</Grid>
</ToggleButton>

<Popup x:Name="PART_Popup"
HorizontalOffset="1"
VerticalOffset="1"
AllowsTransparency="True"
StaysOpen="False"
Placement="Bottom"
Focusable="False"
IsOpen="{Binding IsChecked, ElementName=PART_DropDownButton}">
<Border BorderThickness="1" Background="{StaticResource PopupBackgroundBrush}" BorderBrush="{StaticResource PopupDarkBorderBrush}">
<ContentPresenter x:Name="PART_ContentPresenter" Content="{TemplateBinding DropDownContent}" />
</Border>
</Popup>

</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Fill" TargetName="Arrow" Value="#AFAFAF" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>

我正在像这样创建 DropDownButton:

<extToolkit:DropDownButton VerticalAlignment="Center" Background="Red">
<extToolkit:DropDownButton.Content>
<TextBlock>Click me</TextBlock>
</extToolkit:DropDownButton.Content>
<extToolkit:DropDownButton.DropDownContent>
<TextBlock>Popup</TextBlock>
</extToolkit:DropDownButton.DropDownContent>
</extToolkit:DropDownButton>

我将背景设置为红色,但这没有任何影响。所以我尝试设置 DropDownButton 样式的背景绑定(bind)到我设置的背景:

<Grid Background="{TemplateBinding Background}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<ContentPresenter Margin="{TemplateBinding Padding}" Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" RecognizesAccessKey="true" />
<Grid x:Name="arrowGlyph" IsHitTestVisible="False" Margin="4,3,4,3" Grid.Column="1">
<Path x:Name="Arrow" Width="7" Height="4" Data="M 0,1 C0,1 0,0 0,0 0,0 3,0 3,0 3,0 3,1 3,1 3,1 4,1 4,1 4,1 4,0 4,0 4,0 7,0 7,0 7,0 7,1 7,1 7,1 6,1 6,1 6,1 6,2 6,2 6,2 5,2 5,2 5,2 5,3 5,3 5,3 4,3 4,3 4,3 4,4 4,4 4,4 3,4 3,4 3,4 3,3 3,3 3,3 2,3 2,3 2,3 2,2 2,2 2,2 1,2 1,2 1,2 1,1 1,1 1,1 0,1 0,1 z" Fill="#FF000000" />
</Grid>
</Grid>

但这并没有改变背景颜色,无论我在控件中设置什么。如果我直接在样式中设置背景颜色(无绑定(bind)),那么颜色会生效,但由于某种原因,在 ButtonChrome 上定义的 CornerRadius 消失并且按钮恢复为矩形。

有什么建议吗?我只想在定义控件时能够设置下拉按钮和 PART_Popup 的背景。

最佳答案

ButtonChrome 似乎无法在不丢失 CornerRadius 属性的情况下设置任意背景颜色。如果您不喜欢它,那么您需要寻找替代方案,作为替代方案,我为此使用了 ToggleButton:

<ToggleButton x:Name="ToggleButtonChrome"
Background="{TemplateBinding Background}"
IsEnabled="{TemplateBinding IsEnabled}"
IsChecked="{Binding IsOpen, ElementName=PART_Popup}">

但是我有一个图标 Button 站在中间,对我来说没有方法不能摆脱它,所以我在 Content 属性中用它的空格补偿:

Content=" Click me         " 

要为 Popup 设置 Background,我创建了一个附加依赖属性 Background,它位于 PropertyExtension 命名空间中:

public static class Popup
{
#region Popup Background Property

public static readonly DependencyProperty BackgroundProperty;

public static void SetBackground(DependencyObject DepObject, Brush value)
{
DepObject.SetValue(BackgroundProperty, value);
}

public static Brush GetBackground(DependencyObject DepObject)
{
return (Brush)DepObject.GetValue(BackgroundProperty);
}

#endregion

static Popup()
{
#region Popup Background Registration

PropertyMetadata BrushPropertyMetadata = new PropertyMetadata(Brushes.Transparent);

BackgroundProperty = DependencyProperty.RegisterAttached("Background",
typeof(Brush),
typeof(Popup),
BrushPropertyMetadata);

#endregion
}
}

并在ControlTemplate中设置如下:

<Popup x:Name="PART_Popup"
IsOpen="{Binding IsChecked, ElementName=PART_DropDownButton}"
...>
<Border BorderThickness="1"
Background="{TemplateBinding PropertyExtension:Popup.Background}"> <!-- Here -->

<ContentPresenter x:Name="PART_ContentPresenter"
Content="{TemplateBinding DropDownContent}" />
</Border>
</Popup>

使用示例:

<Grid>
<wpfx:DropDownButton PropertyExtension:Popup.Background="{StaticResource PopupBackground}"
Content=" Click me "
HorizontalContentAlignment="Left"
Background="CadetBlue"
Width="80"
Height="30" >

<wpfx:DropDownButton.DropDownContent>
<TextBlock Width="100"
Height="100"
Text="Popup" />
</wpfx:DropDownButton.DropDownContent>
</wpfx:DropDownButton>
</Grid>

初始状态:

enter image description here

最终状态:

enter image description here

The whole project is available on this link.

下面是一个完整的例子:

<Window.Resources>
<wpfx:InverseBoolConverter x:Key="InverseBoolConverter" />
<SolidColorBrush x:Key="PopupBackground" Color="Beige" />

<Style TargetType="{x:Type wpfx:DropDownButton}">
<Setter Property="BorderThickness" Value="1" />
<Setter Property="IsTabStop" Value="False" />

<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type wpfx:DropDownButton}">
<Grid x:Name="MainGrid"
SnapsToDevicePixels="True">

<ToggleButton x:Name="PART_DropDownButton"
Grid.Column="1"
IsChecked="{Binding IsOpen, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}"
IsHitTestVisible="{Binding IsOpen, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource InverseBoolConverter}}">

<ToggleButton.Template>
<ControlTemplate TargetType="ToggleButton">
<ContentPresenter />
</ControlTemplate>
</ToggleButton.Template>

<Grid>
<ToggleButton x:Name="ToggleButtonChrome"
Background="{TemplateBinding Background}"
IsEnabled="{TemplateBinding IsEnabled}"
IsChecked="{Binding IsOpen, ElementName=PART_Popup}">

<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>

<ContentPresenter Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
RecognizesAccessKey="True" />

<Grid x:Name="arrowGlyph"
IsHitTestVisible="False"
Margin="4,3,4,3"
Grid.Column="1">

<Path x:Name="Arrow"
Width="7"
Height="4"
Data="M 0,1 C0,1 0,0 0,0 0,0 3,0 3,0 3,0 3,1 3,1 3,1 4,1 4,1 4,1 4,0 4,0 4,0 7,0 7,0 7,0 7,1 7,1 7,1 6,1 6,1 6,1 6,2 6,2 6,2 5,2 5,2 5,2 5,3 5,3 5,3 4,3 4,3 4,3 4,4 4,4 4,4 3,4 3,4 3,4 3,3 3,3 3,3 2,3 2,3 2,3 2,2 2,2 2,2 1,2 1,2 1,2 1,1 1,1 1,1 0,1 0,1 z"
Fill="#FF000000" />
</Grid>
</Grid>
</ToggleButton>
</Grid>
</ToggleButton>

<Popup x:Name="PART_Popup"
IsOpen="{Binding IsChecked, ElementName=PART_DropDownButton}"
HorizontalOffset="1"
VerticalOffset="1"
AllowsTransparency="True"
StaysOpen="False"
Placement="Bottom"
Focusable="False">

<Border BorderThickness="1"
Background="{TemplateBinding PropertyExtension:Popup.Background}">

<ContentPresenter x:Name="PART_ContentPresenter"
Content="{TemplateBinding DropDownContent}" />
</Border>
</Popup>
</Grid>

<ControlTemplate.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Fill" TargetName="Arrow" Value="#AFAFAF" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>

<Grid>
<wpfx:DropDownButton PropertyExtension:Popup.Background="{StaticResource PopupBackground}"
Content=" Click me "
HorizontalContentAlignment="Left"
Background="CadetBlue"
Width="80"
Height="30" >

<wpfx:DropDownButton.DropDownContent>
<TextBlock Width="100"
Height="100"
Text="Popup" />
</wpfx:DropDownButton.DropDownContent>
</wpfx:DropDownButton>
</Grid>

关于c# - 修改 WPF 工具包 DropDownButton 样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21713688/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com