问题: 我想在XAML
中创建一个按钮模板,其中我将图像源绑定到内容展示器内容框或类似的东西。Binding ImageSource DesignTime
的解决方案所需的参数: 我明白,一个标准的按键我能一个StackPanel或网格添加到该按钮,将图片插入所述容器和收工。不过,我并不喜欢Windows'chrome'外观,也不是蓝色鼠标,单击和聚焦效果。我试图做的是创建一个新的按钮模板(编辑默认按钮模板的副本,并删除铬容器),有能力成为一个基本模板,随着我添加更多按钮,可以选择更改图像。
事情我已经试过及其结果:
<Button x:Name="btn">
<StackPanel>
<Image source="imgsource.png"/>
</StackPanel>
</Button>
结果:有按钮镀铬效果。如果没有其他可能,可以回落,但我不喜欢它。
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border x:Name="bContainer" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" HorizontalAlignment="{TemplateBinding HorizontalAlignment}" Height="{TemplateBinding Height}" VerticalAlignment="{TemplateBinding VerticalAlignment}" Width="{TemplateBinding Width}">
<Grid x:Name="gBody" Background="#FF3C3C3C"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsKeyboardFocused" Value="true"/>
<Trigger Property="ToggleButton.IsChecked" Value="true"/>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground" Value="#ADADAD"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
<Button Style="{DynamicResource ButtonStyle}">
<Grid>
<Image Source="imgsource.png"/>
</Grid>
</Button>
结果:图像不显示。我认为这是由于按钮自定义模板,但我的知识是有限的,所以我还没有深入研究。
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border x:Name="bContainer" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" HorizontalAlignment="{TemplateBinding HorizontalAlignment}" Height="{TemplateBinding Height}" VerticalAlignment="{TemplateBinding VerticalAlignment}" Width="{TemplateBinding Width}">
<Image x:Name="iImage" Source="{Binding Content, RelativeSource={RelativeSource TemplatedParent}}" HorizontalAlignment="Left" Height="16" VerticalAlignment="Top" Width="16"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsKeyboardFocused" Value="true"/>
<Trigger Property="ToggleButton.IsChecked" Value="true"/>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground" Value="#ADADAD"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
<Button Style="{DynamicResource ButtonStyle}">
<Grid>
<Image Source="imgsource.png"/>
</Grid>
</Button>
结果:进入到图像的完整路径时,图像仅显示了。我不确定我是否正确,但是在部署该程序时会不会造成问题?
把网格与'之间的图像'要求设置按钮的内容属性。为了可视化内容,ControlTemplate应该包含一个ContentPresenter。 – Clemens
谢谢,Clemens!杰森在下面说了同样的想法。对于我在下面发布的解决方案,我还有一个额外的问题。 –