从代码隐藏访问模板中的 XAML 密钥.(基于图像)
本文关键字:密钥 图像 XAML 于图像 隐藏 代码 访问 | 更新日期: 2023-09-27 17:55:29
试图再次解决这个问题,(来自上一篇文章,但我有几个问题需要解决)。
此处的目标是使用在 XAML 中创建的模板从头开始生成多个按钮。每个按钮都是一个带有"简单图标"(PNG/w Alpha)的圆圈,并通过悬停改变颜色。我遇到的问题是在生成图像时让每个按钮更改图像。我似乎无法访问 x:Key 变量 从 XAML.It 现在渲染默认模板(图像和颜色工作)。当我尝试将图像更改为我想要显示的新"图标"时,我似乎无法引用x:Keys(cBG,cBGHi,id,idHi)。
这是我的代码,以及之后的一些注释。提前感谢!:)
XAML
<SolidColorBrush x:Key="cBG" Color="#FFFFFF"/>
<SolidColorBrush x:Key="cBGHi" Color="#00AAFF"/>
<ImageSource x:Key="id">D:'32start.png</ImageSource>
<ImageSource x:Key="idHi">D:'32startHi.png</ImageSource>
<Style x:Key="UXButton" TargetType="{x:Type Button}">
<Setter Property ="Template">
<Setter.Value>
<ControlTemplate x:Name ="userControl" TargetType ="{x:Type Button}">
<Grid x:Name="Grid">
<Ellipse Name ="bgg" Fill="{StaticResource cBG}" Margin="4"/>
<Image x:Name="UXImage" Width="32" Height="32" Source="{DynamicResource id}">
<Image.Clip>
<EllipseGeometry Center="16,16" RadiusX="16" RadiusY="16"/>
</Image.Clip>
</Image>
<ContentPresenter HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property ="IsMouseOver" Value ="True">
<Setter TargetName ="bgg" Property ="Fill" Value ="{StaticResource cBGHi}"/>
<Setter TargetName ="UXImage" Property="Source" Value="{DynamicResource idHi}"/>
</Trigger>
<Trigger Property ="IsPressed" Value ="True">
<Setter TargetName ="bgg" Property ="Fill" Value ="{StaticResource cBG}"/>
<Setter TargetName ="UXImage" Property="Source" Value="{DynamicResource id}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
C#.cs
private void BuildStack()
{
Button b;
Style UXStyle = (Style)FindResource("UXButton");
// UXStyle.id = new BitmapImage(new Uri("D:'NewImage1.png", UriKind.Relative));
// UXStyle.idHi = new BitmapImage(new Uri("D:'NewImage2.png", UriKind.Relative));
b = new Button();
b.Style = UXStyle;
b.HorizontalAlignment = HorizontalAlignment.Left;
b.VerticalAlignment = VerticalAlignment.Top;
b.Margin = new Thickness(10, 10, 0, 0);
b.Width = 48;
b.Height = 48;
UX.Children.Add(b);
}
//笔记
- XAML 位于名为"ButtonStyle.XAML"的资源字典中。
- 模板位于 XAML 中。按钮在代码隐藏中生成。
- 我可以并且已经准备好了在整个程序中使用的预渲染按钮,但这部分很特别,因为它是"最近"或"收藏夹文件"之类的东西。使图标与字符串匹配的可能性将是巨大的。(想想歌曲的专辑封面,或快捷方式的开始菜单图标)。
- 我已经在谷歌上上下搜索了这个。要么,这是不可能的,要么我不知道命名法。
- 我确实找到了称为绑定或数据绑定的东西,但我遇到了同样的问题(在代码隐藏中访问它)。
- 再次感谢!
您应该使用 FindResource 或 TryFindResource。
一个好的做法是创建一个字符串常量,用于映射资源字典中的键名称。
this._image.Fill = (DrawingBrush)csd.FindResource("Image1DrawingBrush");
var resource = FindResource("userControl") as ControlTemplate;