2010-09-16 55 views
0

我已经创建了一个UserControl来制作一个ImageButton。但我用Button替换了UserControl Item。Wpf CustomButton工具栏风格

<Button x:Class="myimagebutton" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:imagebutton"> 

    <Grid x:Name="grdButton"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition /> 
      <ColumnDefinition /> 
     </Grid.ColumnDefinitions> 

     <Image Grid.Column="0" 
       x:Name="btnImage" 
       HorizontalAlignment="Left" 
       VerticalAlignment="Center"> 
     </Image> 
     <TextBlock Grid.Column="1" 
        TextWrapping="Wrap" 
        Text="{Binding Text}" 
        VerticalAlignment="Center" 
        Margin="2 0 2 0" /> 
    </Grid> 
</Button> 

现在我想将工具栏按钮样式应用于我的按钮,如果此按钮位于工具栏中。我已阅读这篇文章link text并把这个

If Me.Style Is Nothing AndAlso TypeOf Me.Parent Is ToolBar Then 
    Me.Style = DirectCast(FindResource(ToolBar.ButtonStyleKey), Style) 
End If 

在我的Codebehind。

之后,我把我的按钮放在一个工具栏,另一个出来的工具栏来测试它。但按钮总是获得默认样式。调试后,我发现Me.Parent总是没有。所以现在是我的问题如何获取我的按钮在工具栏中的信息?

回答

0

我在理解你所描述的内容时有些困难,但在阅读了几遍之后,我想我明白了。

我到目前为止是否正确?

如果是的话,你想知道为什么你的按钮具有图像

关于你的描述是扔我和可能是为什么你还没有见过任何人发帖回答你的问题的原因有几点建议迄今。

我更换了用户控件项目的一个按钮

基本上你做了什么是创造了新的控制是有可能从按钮继承。您可能已经开始使用UserControl,但为了替换XAML中的根项目,您还必须确保类型myimagebutton继承自Button。这就是XAML的工作原理,学习如何以这种方式解释它可以帮助人们理解你在做什么。

通常从Button继承并不是开发人员重写WPF中按钮的视觉样式主要是因为WPF不支持有时称为visual inheritance的概念,还有其他合适的方法可用于以不同的方式解决问题。相反,继承主要用于在需要对现有控件类进行行为修改或添加时。据说有些方法通过使用类似于ASP.NET中的内容页面和母版页的内容控件来模拟可视化继承,但我认为这有点超出了示例的范围。同样,如果你要追求继承模型,你需要确保在你的代码中,你在静态构造函数中设置了正确的默认样式,所以将代码放在你的按钮后面也会有帮助。

我相信你的例子不工作的原因是因为ToolBar专门查看控件的类型而不考虑继承以便应用它的自定义工具栏样式。在你的情况下,你的控件的类型是myimagebutton,而不是Button,所以样式不是由ToolBar设置的,它通常根据使用两种潜在类型的调用的控件的类型直接设置Style属性。

element.SetResourceReference(FrameworkElement.StyleProperty, styleKey); 
element.DefaultStyleKey = styleKey; 

顺便说一句,你的情况我相信,只有第二行是由工具栏控制和styleKey在这一点上进行定义为空。

现在,您不必先从Button继承,而是为您的按钮创建新的ControlTemplate或DataTemplate,并分别通过使用样式分配到Template或ContentTemplate属性中。这样你仍然总是处理一个按钮,风格是改变视觉属性的东西。

<Window x:Class="HeaderedContentControlTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" 
     Height="252" 
     Width="372"> 
    <Window.Resources> 
     <Style TargetType="{x:Type Label}"> 
      <Setter Property="Background" 
        Value="Orange" /> 
     </Style> 

     <DataTemplate x:Key="ImageButtonDataTemplate"> 
      <Grid x:Name="grdButton"> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition /> 
        <ColumnDefinition /> 
       </Grid.ColumnDefinitions> 

       <Image Grid.Column="0" 
         HorizontalAlignment="Left" 
         VerticalAlignment="Center"> 
       </Image> 
       <TextBlock Grid.Column="1" 
          TextWrapping="Wrap" 
          Text="{Binding}" 
          VerticalAlignment="Center" 
          Margin="2 0 2 0" 
          Background="Pink" /> 
      </Grid> 
     </DataTemplate> 

     <Style x:Key="ImageButtonStyle" 
       TargetType="{x:Type Button}"> 
      <Setter Property="ContentTemplate" 
        Value="{StaticResource ImageButtonDataTemplate}" /> 
     </Style> 

    </Window.Resources> 
    <Grid Margin="11"> 
     <Grid.RowDefinitions> 
      <RowDefinition /> 
      <RowDefinition /> 
     </Grid.RowDefinitions> 

     <ToolBar> 
      <Button Style="{StaticResource ImageButtonStyle}" 
        Content="Some Text" /> 
     </ToolBar> 

     <Button Grid.Row="1" 
       Style="{StaticResource ImageButtonStyle}" 
       VerticalAlignment="Center" 
       HorizontalAlignment="Center" 
       Content="Some Text" /> 
    </Grid> 
</Window> 

使用的ContentTemplate允许您重新定义按钮内的内容不会丢失所有的特殊按钮状态转换和其他细微你通常想保留的。

请参阅MSDN论坛上的this related post论坛也解释了将一个包含按钮的StackPanel添加到ToolBar时的类似行为。