如何在运行时将动态资源分配给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中包含动态资源名称的变量?

谢谢!

如何在运行时将动态资源分配给WPF代码中的按钮

免责声明:我离开了一段时间,你对你的帖子进行了编辑,没有错!:)我希望这些信息对你仍然有用。您可以更简单地获取资源。

如果它是一个共享资源,你可以做一个(比如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>