【问题标题】:Interacting with the ControlTemplate of the Embedded ToggleButton inside an Expander与 Expander 内的嵌入式 ToggleButton 的 ControlTemplate 交互
【发布时间】:2014-05-30 20:39:51
【问题描述】:

我真的希望有人能在这里教我一些新东西,因为必须有一条更清洁的路线。

在工具包的Expander 控件的Style 模板内,有一个嵌入式ToggleButton,用于处理扩展器区域的切换。我想找到一种更好的方法来触摸特定的 UIElement,而不必重申 Expander 的整个样式。例如,如果它位于ExpanderStyle 模板中;

<ToggleButton x:Name="ExpanderButton"
              Grid.Row="0" Grid.Column="0"
              MinWidth="0" MinHeight="0"
              Margin="1"
              HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"
              VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"
              Content="{TemplateBinding Header}"
              ContentTemplate="{TemplateBinding HeaderTemplate}"
              FontFamily="{TemplateBinding FontFamily}"
              FontSize="{TemplateBinding FontSize}"
              FontStretch="{TemplateBinding FontStretch}"
              FontStyle="{TemplateBinding FontStyle}"
              FontWeight="{TemplateBinding FontWeight}"
              Foreground="{TemplateBinding Foreground}"
              IsChecked="{TemplateBinding IsExpanded}"
              Padding="{TemplateBinding Padding}"
              Template="{StaticResource TheExpanderToggleButtonStyle}" />

我们看到Template="{StaticResource TheExpanderToggleButtonStyle}" 只是指向另一个单独的ControlTemplate 用于那个ToggleButton 对吗?所以我希望我可以在实例级别做一些事情,并且只为 ToggleButton 提供一个不同的模板,也许可以像这样实现它;

<toolkit:Expander>
   <toolkit:Expander.Resources>
      <Style TargetType="ToggleButton">
          <Setter Property="Template" Value="{StaticResource ADifferentToggleButtonStyle}"/>           
      </Style>
   </toolkit:Expander.Resources>

   <TextBlock Text="Blah"/>

</toolkit:Expander>

...或者相同类型的概念多种不同的方式我可以从类似的例子中想到,我真的没想到会工作它只是碰巧是我在发布之前尝试的最后一个,试图把它扔在头上,我什至不知道有多少不同的尝试,但无济于事。所以我现在只是复制两个该死的模板来制作一个自定义扩展器,但就像我说的那样,我希望有人能教我一种更好的方法,这在未来会很有帮助。干杯!

【问题讨论】:

    标签: silverlight xaml templates controltemplate


    【解决方案1】:
    <toolkit:Expander
        my:ExpanderExtensions.ToggleButtonStyle="{StaticResource MyToggleBtnStyle}"/>
    

    还有代码:

    public static class ExpanderExtensions
    {
        public static Style GetToggleButtonStyle( Expander expander )
        {
            return (Style) expander.GetValue( ToggleButtonStyleProperty );
        }
    
        public static void SetToggleButtonStyle( Expander expander, Style value )
        {
            expander.SetValue( ToggleButtonStyleProperty, value );
        }
    
        public static readonly DependencyProperty ToggleButtonStyleProperty =
            DependencyProperty.RegisterAttached( "ToggleButtonStyle",
            typeof( Style ), typeof( ExpanderExtensions ),
                        new PropertyMetadata( OnToggleButtonStyleChanged ) );
    
        private static void OnToggleButtonStyleChanged(
                    DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            Expander expander = d as Expander;
            if (expander == null) return;
    
            if (expander.IsLoaded())
                ApplyToggleButtonStyle(expander, e.NewValue as Style);
            else
                expander.Loaded += OnExpanderLoaded;
        }
    
        private static void OnExpanderLoaded(object sender, RoutedEventArgs e)
        {
                Expander expander = (Expander) sender;
                expander.Loaded -= OnExpanderLoaded;
                ApplyToggleButtonStyle( expander, GetToggleButtonStyle(expander) );
        }
    
        private static void ApplyToggleButtonStyle(
                    Expander expander, Style toggleButtonStyle)
        {
                //VisualTreeExtensions.GetVisualDescendants
                // is from System.Windows.Controls.Toolkit.dll
            var expanderToggleButton = expander.GetVisualDescendants().
                            OfType<ToggleButton>().First();
            expanderToggleButton.Style = toggleButtonStyle;
        }
    }
    
    public static class ControlExtensions
    {
        public static bool IsLoaded(this FrameworkElement element)
        {
            return element.GetVisualChildren().Any();
    
            //I'm not sure if this alternative is better:
            //return control.GetVisualParent() != null;
        }
    }
    

    [编辑] 您可以通过Style 设置Template,但如果您不想设置样式,只需将附加属性的类型更改为ControlTemplate 并调整ApplyToggleButtonStyle 方法。

    【讨论】:

    • 谢谢马丁!当我有更多时间时让我看看这个,我真的不想走程序路线,但可能是一个不错的选择。
    • @ChrisW。 :我稍微改变了它,现在Loaded 事件处理程序在事件触发后被分离。关于程序性与声明性方法:是的,我更喜欢 Expander 控件提供的公共属性 ToggleButtonStyle。但最初的开发者选择不提供这种必要的定制方式。我认为我的方法类似于梦想中的解决方案,并且将来可以轻松更改,以防万一在新版本的工具包中发布了增强的扩展器,提供这样的属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    相关资源
    最近更新 更多