如何在 setter 上为触发器 wpf c# 设置静态变量
How do I set a static variable on a setter for a trigger wpf c#
在我的自定义控件中,我的控件模板中有两个彼此相邻的切换按钮,我试图在按下一个或另一个切换按钮时为整个自定义控件的背景设置一种颜色。
下面是我的理解代码:
<local:SplitButtonModel.Template>
<ControlTemplate TargetType="{x:Type local:SplitButtonModel">
<ControlTemplate.Resources>
<Style TargetType="{x:Type ToggleButton">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ToggleButton}">
<Rectangle x:Name="rect" Fill="Transparent" Stroke="#00000000"/>
<ContentPresenter SnapToDevicePixels="{TemplatedBinding SnapToDevicePixels}"
HorizontalAlignment="{TemplatedBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplatedBinding VerticalContentAlignment}"
RecognizeAccessKey="True"/>
<ControlTemplate.Triggers>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Fill" TargetName="rect" Value="Red"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ControlTemplate.Resources>
<Border x:Name="border" Background="{TemplatedBinding Background}"
BorderBrush="{TemplatedBinding BorderBrush}"
BorderThickness="{TemplatedBinding BorderThickness}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto" MinWidth="15"/>
</Grid.ColumnDefinitions>
<ToggleButton Grid.Column="0"/>
<ToggleButton Grid.Column="1"/>
</Grid>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Background" TargetName="border" Value="Red"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</local:SplitButtonModel.Template>
所以在我将背景设置为红色的模板中,它不起作用,因为 IsPressed 绑定到 ToggleButton 并且它永远不会在主模板中被调用。现在,如果我在 IsPressed 上将 Rectangle“rect”Fill 属性 设置为 Red,那可以正常工作,但它只会使 ToggleButton 被按下为红色,而我希望两个 ToggleButton 都被触发,即使另一个没有被按下上。
我正在考虑创建一个静态的 class,如下所示:
public static class GlobalHelper
{
public static bool ButtonPressed = false;
}
然后我会设置触发器如下:
<Trigger Property="IsPressed" Value="True">
<Setter Property="{Binding Source="{x:Static local:GlobalHelper.ButtonPressed}}" Value="True"/>
</Trigger>
但这不起作用,那么修改静态值的方法是什么,这样我就可以在主模板中使用 DataTrigger 访问它,并根据它是真还是假,我可以将背景设置为红色?
您可以使用 DataTriggers,连接到 ToggleButtons IsPressed 属性,在 UserControl 模板中:
<Border x:Name="border"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto" MinWidth="15"/>
</Grid.ColumnDefinitions>
<ToggleButton Grid.Column="0" x:Name="b1"/>
<ToggleButton Grid.Column="1" x:Name="b2"/>
</Grid>
</Border>
<ControlTemplate.Triggers>
<DataTrigger Binding="{Binding IsPressed, ElementName=b1}" Value="True">
<Setter Property="Background" TargetName="border" Value="Red"/>
</DataTrigger>
<DataTrigger Binding="{Binding IsPressed, ElementName=b2}" Value="True">
<Setter Property="Background" TargetName="border" Value="Red"/>
</DataTrigger>
</ControlTemplate.Triggers>
使用全局静态变量没有意义,因为它会影响 所有 用户控件,而不是当前按下的那个。
在我的自定义控件中,我的控件模板中有两个彼此相邻的切换按钮,我试图在按下一个或另一个切换按钮时为整个自定义控件的背景设置一种颜色。
下面是我的理解代码:
<local:SplitButtonModel.Template>
<ControlTemplate TargetType="{x:Type local:SplitButtonModel">
<ControlTemplate.Resources>
<Style TargetType="{x:Type ToggleButton">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ToggleButton}">
<Rectangle x:Name="rect" Fill="Transparent" Stroke="#00000000"/>
<ContentPresenter SnapToDevicePixels="{TemplatedBinding SnapToDevicePixels}"
HorizontalAlignment="{TemplatedBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplatedBinding VerticalContentAlignment}"
RecognizeAccessKey="True"/>
<ControlTemplate.Triggers>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Fill" TargetName="rect" Value="Red"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ControlTemplate.Resources>
<Border x:Name="border" Background="{TemplatedBinding Background}"
BorderBrush="{TemplatedBinding BorderBrush}"
BorderThickness="{TemplatedBinding BorderThickness}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto" MinWidth="15"/>
</Grid.ColumnDefinitions>
<ToggleButton Grid.Column="0"/>
<ToggleButton Grid.Column="1"/>
</Grid>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Background" TargetName="border" Value="Red"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</local:SplitButtonModel.Template>
所以在我将背景设置为红色的模板中,它不起作用,因为 IsPressed 绑定到 ToggleButton 并且它永远不会在主模板中被调用。现在,如果我在 IsPressed 上将 Rectangle“rect”Fill 属性 设置为 Red,那可以正常工作,但它只会使 ToggleButton 被按下为红色,而我希望两个 ToggleButton 都被触发,即使另一个没有被按下上。
我正在考虑创建一个静态的 class,如下所示:
public static class GlobalHelper
{
public static bool ButtonPressed = false;
}
然后我会设置触发器如下:
<Trigger Property="IsPressed" Value="True">
<Setter Property="{Binding Source="{x:Static local:GlobalHelper.ButtonPressed}}" Value="True"/>
</Trigger>
但这不起作用,那么修改静态值的方法是什么,这样我就可以在主模板中使用 DataTrigger 访问它,并根据它是真还是假,我可以将背景设置为红色?
您可以使用 DataTriggers,连接到 ToggleButtons IsPressed 属性,在 UserControl 模板中:
<Border x:Name="border"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto" MinWidth="15"/>
</Grid.ColumnDefinitions>
<ToggleButton Grid.Column="0" x:Name="b1"/>
<ToggleButton Grid.Column="1" x:Name="b2"/>
</Grid>
</Border>
<ControlTemplate.Triggers>
<DataTrigger Binding="{Binding IsPressed, ElementName=b1}" Value="True">
<Setter Property="Background" TargetName="border" Value="Red"/>
</DataTrigger>
<DataTrigger Binding="{Binding IsPressed, ElementName=b2}" Value="True">
<Setter Property="Background" TargetName="border" Value="Red"/>
</DataTrigger>
</ControlTemplate.Triggers>
使用全局静态变量没有意义,因为它会影响 所有 用户控件,而不是当前按下的那个。