积极答复者
请教WPF Button显示图片

问题
-
答案
-
第一个问题,如果你编译运行是好的,那就好了,因为设计器无法再设计时探测到你的文件。还有,你在项目中建立了res目录并且将reset.png include到项目中放入res中了吗?且设置了reset.png 的Build Action为 Resoruces:
闪烁的效果是Button的内部控制的VisualState决定的。http://msdn.microsoft.com/en-us/library/ms753328.aspx 文档列出了Button的默认样式和VisualState. 你可以重写他的模板来定义自己的行为。
例如我们移除 RenderDefaulted="{TemplateBinding Button.IsDefaulted}" RenderMouseOver="{TemplateBinding UIElement.IsMouseOver}" ,就可以避免闪烁。
<ControlTemplate TargetType="ButtonBase"> <my:ButtonChrome Background="{TemplateBinding Control.Background}" BorderBrush="{TemplateBinding Control.BorderBrush}" Name="Chrome" RenderPressed="{TemplateBinding ButtonBase.IsPressed}" SnapsToDevicePixels="True"> <ContentPresenter Content="{TemplateBinding ContentControl.Content}" ContentStringFormat="{TemplateBinding ContentControl.ContentStringFormat}" ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}" HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}" Margin="{TemplateBinding Control.Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding Control.VerticalContentAlignment}" /> </my:ButtonChrome> <ControlTemplate.Triggers> <Trigger Property="UIElement.IsKeyboardFocused" Value="True"> <Setter Property="my:ButtonChrome.RenderDefaulted" TargetName="Chrome" Value="True" /> </Trigger> <Trigger Property="ToggleButton.IsChecked" Value="True"> <Setter Property="my:ButtonChrome.RenderPressed" TargetName="Chrome" Value="True" /> </Trigger> <Trigger Property="UIElement.IsEnabled" Value="False"> <Setter Property="Control.Foreground" Value="#FFADADAD" /> </Trigger> </ControlTemplate.Triggers> </ControlTemplate>
-------------------------------
最后送你一个我写的图片按钮:http://code.msdn.microsoft.com/windowsdesktop/Dynamic-Image-Button-in-WPF-caec28b7
做一个好的图片按钮,肯定是从修改重写样式模板开始。
Bob Bao [MSFT]
MSDN Community Support | Feedback to us
- 已标记为答案 small zombies 2012年6月15日 9:53
全部回复
-
第一个问题,如果你编译运行是好的,那就好了,因为设计器无法再设计时探测到你的文件。还有,你在项目中建立了res目录并且将reset.png include到项目中放入res中了吗?且设置了reset.png 的Build Action为 Resoruces:
闪烁的效果是Button的内部控制的VisualState决定的。http://msdn.microsoft.com/en-us/library/ms753328.aspx 文档列出了Button的默认样式和VisualState. 你可以重写他的模板来定义自己的行为。
例如我们移除 RenderDefaulted="{TemplateBinding Button.IsDefaulted}" RenderMouseOver="{TemplateBinding UIElement.IsMouseOver}" ,就可以避免闪烁。
<ControlTemplate TargetType="ButtonBase"> <my:ButtonChrome Background="{TemplateBinding Control.Background}" BorderBrush="{TemplateBinding Control.BorderBrush}" Name="Chrome" RenderPressed="{TemplateBinding ButtonBase.IsPressed}" SnapsToDevicePixels="True"> <ContentPresenter Content="{TemplateBinding ContentControl.Content}" ContentStringFormat="{TemplateBinding ContentControl.ContentStringFormat}" ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}" HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}" Margin="{TemplateBinding Control.Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding Control.VerticalContentAlignment}" /> </my:ButtonChrome> <ControlTemplate.Triggers> <Trigger Property="UIElement.IsKeyboardFocused" Value="True"> <Setter Property="my:ButtonChrome.RenderDefaulted" TargetName="Chrome" Value="True" /> </Trigger> <Trigger Property="ToggleButton.IsChecked" Value="True"> <Setter Property="my:ButtonChrome.RenderPressed" TargetName="Chrome" Value="True" /> </Trigger> <Trigger Property="UIElement.IsEnabled" Value="False"> <Setter Property="Control.Foreground" Value="#FFADADAD" /> </Trigger> </ControlTemplate.Triggers> </ControlTemplate>
-------------------------------
最后送你一个我写的图片按钮:http://code.msdn.microsoft.com/windowsdesktop/Dynamic-Image-Button-in-WPF-caec28b7
做一个好的图片按钮,肯定是从修改重写样式模板开始。
Bob Bao [MSFT]
MSDN Community Support | Feedback to us
- 已标记为答案 small zombies 2012年6月15日 9:53