我创建了一个UserControl来制作一个ImageButton
:
<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>
现在我想将default Toolbar Button Style应用于我的按钮,如果此按钮在工具栏中。我已阅读此文章link text,并放置了此
If Me.Style Is Nothing AndAlso TypeOf Me.Parent Is ToolBar Then
Me.Style = DirectCast(FindResource(ToolBar.ButtonStyleKey), Style)
End If
在我后面的代码中。
[作为测试,我将我的Button既放在工具栏中,又另一个放在工具栏中,以对其进行测试。但是Button总是获得默认样式,而不是我尝试设置的样式。
调试后,我发现Me.Parent
始终为Nothing
。现在是我的问题:如何获取按钮是否在工具栏中的信息?
我在准确理解您的描述时遇到了一些困难,但经过几次阅读后,我认为我理解了。
我到目前为止正确吗?
如果是这样,您想知道为什么按钮上有图像
关于您的描述的一些提示使我失望,这很可能是您到目前为止尚未看到其他人为您的问题提供答案的原因。
我用按钮替换了UserControl项
基本上,您所做的是创建了一个新的控件,该控件很可能继承自Button。您可能从UserControl开始,但是要替换XAML中的根项目,还必须确保myimagebutton类型也继承自Button。这就是XAML的工作方式,学习如何用这种方式进行解释将有助于人们了解您在做什么。
通常,从Button继承不是开发人员如何在WPF中覆盖按钮的视觉样式,主要是因为WPF不支持有时称为visual inheritance的概念,并且还有其他合适的方法可以用来用另一种方式解决问题。相反,继承主要保留给需要对现有控件类进行行为修改或添加的情况。话虽这么说,但有多种方法可以通过使用与ASP.NET中的内容页和母版页类似的内容控件来使用,以模拟视觉继承,但是我认为这超出了您的示例范围。同样,如果您要使用继承模型,则需要确保在后面的代码中您正在静态构造函数中设置正确的默认样式,因此将代码发布到按钮后面也将有所帮助。
我相信您的示例无法正常工作的原因是,工具栏专门查看控件的类型,而与继承无关,以便应用其自定义工具栏样式。在您的情况下,控件的类型是myimagebutton而不是Button,因此样式不是由ToolBar设置的,该工具栏通常使用两种潜在的调用类型根据控件的类型直接设置Style属性。
element.SetResourceReference(FrameworkElement.StyleProperty, styleKey);
element.DefaultStyleKey = styleKey;
顺便说一句,在您的情况下,我相信ToolBar控件仅执行第二行,并且此时的styleKey定义为null。
现在,最好不要为Button创建一个新的ControlTemplate或DataTemplate并通过使用样式分别分配给Template或ContentTemplate属性,而不是从Button继承。这样,您仍然始终需要处理按钮,而样式是改变视觉属性的原因。
<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可以重新定义Button的内部内容,而又不会失去所有通常希望保留的特殊按钮状态转换和其他优点。
请参见MSDN论坛上的this related post,它还解释了将包含按钮的StackPanel添加到ToolBar时的类似行为。