2011-09-22 62 views
2

我正在制作一个自定义控件,它有两种非常不同的样式需求。一个用于基本外观,另一个用于更高级的外观。两种风格之间的自定义控件切换

我的控件包含一个依赖属性为以下枚举:

public enum ControlTypes 
{ 
    Basic, 
    Advanced 
} 

我创建了两种风格在generic.xaml(具有非常不同的模板),并给每一个关键。

在枚举属性的更改处理程序内我试图找到样式并设置正确的。

private static void OnControlTypePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    var myCustomControl = (MyCustomControl)d; 

    var basicControlStyle = Application.Current.TryFindResource("BasicControlStyle") as Style; 
    var advancedControlStyle = Application.Current.TryFindResource("AdvancedControlStyle") as Style; 

    if (myCustomControl.ControlType == ControlTypes.Basic) 
     myCustomControl.Style = basicControlStyle; 
    else if (myCustomControl.ControlType == ControlTypes.Advanced) 
     myCustomControl.Style = advancedControlStyle;    
} 

这两种样式总是空的。我不确定如何从generic.xaml中获取样式。还是有更好的方式来交换我的风格?

+0

如何简单地将每个容器的Visible属性绑定到枚举的当前值? – kenny

+0

控件有几个必需的部分,两个模板都是相同的(尽管模板完全不同)。我目前在ApplyTemplate覆盖内找到模板部分。如果我给每个部件一个唯一的名称,并且在控件类型更改时重新获取它们(使用每个部件的第二个名称),那么您的建议将起作用。这个古怪的设计将很好地避免。 – mbursill

+0

在这种情况下,您可以将Visibility属性绑定到控件中的“IsAdvancedStyle”属性(而不是通过控件中的名称引用所有内容) - 但这不是最佳解决方案。 Application.Current.TryFindResource的结果是否返回null?它是否返回一个非'样式'实例?不要忘记资源名称区分大小写。 'generic.xaml'是否已正确添加到主应用程序资源集合中? – fatty

回答

1

删除OnControlTypePropertyChanged中的代码,并在您的XAML中放置类似的内容。请注意,我已经绑定到一个名为IsAdvanced属性,因为它是为测试简单,但可以绑定到通过改变“真”的一个枚举{X:静态命名空间:nameofyourenum.Value}

<Style TargetType="local:SomeControl"> 
    <Style.Setters> 
     <Setter Property="Control.Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="local:SomeControl"> 
        <StackPanel> 
         <TextBlock Text="DefaultTemplate"></TextBlock> 
        </StackPanel> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style.Setters> 
    <Style.Triggers> 
     <Trigger Property="IsAdvanced" Value="True"> 
      <Trigger.Setters> 
       <Setter Property="Control.Template"> 
        <Setter.Value> 
         <ControlTemplate TargetType="local:SomeControl"> 
          <TextBlock Text="Advanced Template"></TextBlock> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Trigger.Setters> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

注意,这仍然让使用控件的程序员能够完全覆盖控件模板并做他们想做的事情。你的原始方法不允许这样做。