【问题标题】:Set image runtime in VisualBrush with c#使用 c# 在 VisualBrush 中设置图像运行时
【发布时间】:2013-01-27 00:15:55
【问题描述】:

实际上,我将在设计时从资源中获取的图像设置为 xaml 文件,如下所示:

<Button Click="btnLogin_Click" Name="btnLogin">
    <StackPanel Orientation="Horizontal">
        <Rectangle Width="20" Height="20" Name="recLogin">
            <Rectangle.Resources>
                <SolidColorBrush x:Key="BlackBrush" Color="White" />
            </Rectangle.Resources>
            <Rectangle.Fill>
                <VisualBrush Stretch="Fill" Visual="{StaticResource appbar_user}" x:Name="brushLogin" />
            </Rectangle.Fill>
        </Rectangle>
        <TextBlock Text=" login" Name="txbLogin" />
    </StackPanel>
</Button>

并且工作正常。但是(是一个登录按钮)我希望当用户登录时,按钮上的图像(矩形内)会改变..

我该怎么办?

【问题讨论】:

    标签: c# wpf image xaml visualbrush


    【解决方案1】:

    当模型中的属性更新时,您可以使用DataTrigger 更改图像。

    在此示例中,布尔值 IsLoggedIn 被更改,这反过来又会更改图像。

    例子:

    Xaml:

    <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="125.078" Width="236.441" Name="UI" >
        <Window.Resources>
    
            <VisualBrush x:Key="Loggedin">
                <VisualBrush.Visual>
                    <Image Source="http://icons.iconarchive.com/icons/deleket/sleek-xp-basic/32/Ok-icon.png" Stretch="Uniform" />
                </VisualBrush.Visual>
            </VisualBrush>
    
            <VisualBrush x:Key="NotLoggedin">
                <VisualBrush.Visual>
                    <Image Source="http://icons.iconarchive.com/icons/deleket/sleek-xp-basic/32/Close-2-icon.png" Stretch="Uniform" />
                </VisualBrush.Visual>
            </VisualBrush>
    
        </Window.Resources>
    
        <Grid DataContext="{Binding ElementName=UI}">
            <Button Click="btnLogin_Click" Name="btnLogin" HorizontalAlignment="Left" Width="94" Height="40" VerticalAlignment="Top" Margin="63,26,0,0">
                <StackPanel Orientation="Horizontal">
                    <Rectangle Width="20" Height="20" Name="recLogin">
                        <Rectangle.Resources>
                            <SolidColorBrush x:Key="BlackBrush" Color="White" />
                        </Rectangle.Resources>
                        <Rectangle.Style>
                            <Style TargetType="{x:Type Rectangle}">
                                <Setter Property="Fill" Value="{StaticResource NotLoggedin}" />
                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding IsLoggedIn}" Value="True">
                                        <Setter Property="Fill" Value="{StaticResource Loggedin}" />
                                    </DataTrigger>
                                </Style.Triggers>
                            </Style>
                        </Rectangle.Style>
                    </Rectangle>
                    <TextBlock Text=" login" Name="txbLogin" />
                </StackPanel>
            </Button>
        </Grid>
    </Window>
    

    代码:

    public partial class MainWindow : Window, INotifyPropertyChanged
    {
        private bool _isLoggedIn;
    
        public MainWindow()
        {
            InitializeComponent();  
        }
    
        public bool IsLoggedIn
        {
            get { return _isLoggedIn; }
            set { _isLoggedIn = value; NotifyPropertyChanged("IsLoggedIn"); }
        }
    
        private void btnLogin_Click(object sender, RoutedEventArgs e)
        {
            IsLoggedIn = !IsLoggedIn;
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChanged(string property)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(property));
            }
        }
     }
    

    注意:我只是使用在线图片,因为我没有您的资源,您可以根据自己的需要进行更改

    结果:

    IsLoggedIn = 假; IsLoggedIn = true;

    【讨论】:

    • 谢谢!!,我还有一个小问题:在我的 xaml 中,我使用的是 ResourceDictionary... 这会为 &lt;VisualBrush x:Key="Loggedin"&gt; 和其他...造成冲突...
    • ResourceDictionary 是否包含任何具有相同密钥的资源?你应该可以使用任何你想要的名字,
    • 这是我的资源:` `
    • ` ResourceDictionary.MergedDictionaries> `
    • 尝试将它们重命名为 somthing else,其中一个 xaml 文件必须在某处具有相同的键名
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多