如何在运行时将动态资源分配给WPF代码中的按钮
本文关键字:代码 WPF 按钮 动态资源分配 运行时 | 更新日期: 2023-09-27 18:22:02
我遇到了以下关于用从现有资源创建的视觉画笔填充矩形的问题。
如果我用XAML硬编码,它会是这样的。。。
<ToggleButton Style="{DynamicResource MetroCircleToggleButtonStyle}" Height="60" Width="60">
<ToggleButton.Content>
<StackPanel Orientation="Vertical">
<Rectangle Height="30" Width="30">
<Rectangle.Fill>
<VisualBrush Visual="{StaticResource appbar_database}" Stretch="Uniform" />
</Rectangle.Fill>
</Rectangle>
</StackPanel>
</ToggleButton.Content>
我试着在代码背后做这件事。。。并在运行时将资源名称作为组合控件(按钮和标签)的一部分传入。我为这个组合控件(标题和图标资源)创建了两个DependencyProperty,并试图在图标资源更新后更新按钮内容,但这部分代码似乎从未执行过:(…有什么想法吗?
[编辑]我已经为图标资源路径创建了依赖项属性。。。
public string Caption
{
get { return (string)GetValue(TextProperty); }
set
{
SetValue(TextProperty, value);
if (string.IsNullOrEmpty(value))
{
tbCaption.Visibility = System.Windows.Visibility.Collapsed;
}
}
}
public string IconResource
{
get { return (string)GetValue(IconProperty); }
set
{
SetValue(IconProperty, value);
object icon = TryFindResource(value);
if (icon != null)
{
Visual iconVisual = icon as Visual;
((Rectangle)mainButton.Content).Fill = new VisualBrush(iconVisual);
}
}
}
public static readonly DependencyProperty TextProperty =
DependencyProperty.Register("Caption", typeof(string), typeof(ButtonWithText), null);
public static readonly DependencyProperty IconProperty =
DependencyProperty.Register("IconResource", typeof(string), typeof(ButtonWithText), null)
或
有没有办法绑定XAML中包含动态资源名称的变量?
谢谢!
免责声明:我离开了一段时间,你对你的帖子进行了编辑,没有错!:)我希望这些信息对你仍然有用。您可以更简单地获取资源。
如果它是一个共享资源,你可以做一个(比如app.xaml,或者一个合并的dict.there)。我刚刚制作了一个小样本应用程序,并将样式放在app.xaml.中
var style = (Style)Application.Current.TryFindResource("MetroCircleToggleButtonStyle");
在码尾:
var style = (Style)TryFindResource("MetroCircleToggleButtonStyle");
在哪里获取它在某种程度上取决于你把资源放在哪里。我没有为您找到范围链接,但如果您愿意,可以在此处进行一些挖掘。我使用TDD,所以我会为此提供服务,特别是如果你必须使用Applicationl.Current,它是静态的等等。事实上,我会在我的视图模型库中的某个地方把它作为一个接口,不管怎样,这都是不主题的。希望这能帮助你!:)
FrameworkElement.TryFindResource
Application.TryfindResource
干杯,
Stian
好吧,我想我找到了解决这个问题的方法。
我能够通过以下操作传入资源:
在后面的代码中。。。
public Canvas IconResource
{
get { return (Canvas)GetValue(IconProperty); }
set
{
SetValue(IconProperty, value);
}
}
public static readonly DependencyProperty IconProperty =
DependencyProperty.Register("IconResource", typeof(Canvas), typeof(ButtonWithText), null);
在XAML 中
<ToggleButton x:Name="mainButton" Grid.Row="0" Style="{DynamicResource MetroCircleToggleButtonStyle}" Height="60" Width="60">
<ToggleButton.Content>
<Rectangle Height="30" Width="30">
<Rectangle.Fill>
<VisualBrush Visual="{Binding IconResource}"></VisualBrush>
</Rectangle.Fill>
</Rectangle>
</ToggleButton.Content>
</ToggleButton>
而且。。。当尝试使用这个控件时,我只会传入整个动态资源
<k:ButtonWithText Caption="Hello" IconResource="{StaticResource appbar_magnify}"></k:ButtonWithText>
型号:
public class Status
{
public string IconName{get;set;}
public Canvas Icon
{
get
{
try
{
return Application.Current.FindResource(IconName) as Canvas;
}
catch(System.Windows.ResourceReferenceKeyNotFoundException e)
{
return null;
}
}
}
}
ViewModel:
public StatusViewModel
{
public Status Status{get;set;}
public StatusViewModel()
{
Status = new Status{IconName="appbar_database}"};
}
}
Page.cs
DataContext = new StatusViewModel();
页面XAML
<ToggleButton x:Name="mainButton" Grid.Row="0" Style="{DynamicResource MetroCircleToggleButtonStyle}" Height="60" Width="60">
<ToggleButton.Content>
<Rectangle Height="30" Width="30">
<Rectangle.Fill>
<VisualBrush Visual="{Binding Status.Icon}"></VisualBrush>
</Rectangle.Fill>
</Rectangle>
</ToggleButton.Content>