【问题标题】:How do I set a static variable on a setter for a trigger wpf c#如何在设置器上设置静态变量以触发 wpf c#
【发布时间】:2020-12-31 00:58:24
【问题描述】:

在我的自定义控件中,我的控件模板中有两个彼此相邻的切换按钮,当一个或另一个切换按钮被按下时,我试图为整个自定义控件的背景设置一种颜色。

这是我的理解代码:

<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 属性设置为红色,这将正常工作,但它只会使 ToggleButton 被按下红色,而我希望两个 ToggleButton 都被触发,即使另一个没有被按下。

我正在考虑创建一个静态类,如下所示:

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 访问它,并根据它是真还是假,我可以将背景设置为红色?

【问题讨论】:

    标签: c# wpf xaml data-binding custom-controls


    【解决方案1】:

    您可以在 UserControl 模板中使用 DataTriggers,连接到 ToggleButtons IsPressed 属性:

    <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>
    

    使用全局静态变量没有意义,因为它会影响所有用户控件,而不是当前按下的那个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-22
      • 2018-08-18
      • 1970-01-01
      • 1970-01-01
      • 2010-11-09
      • 2014-11-10
      • 1970-01-01
      相关资源
      最近更新 更多