Установите время выполнения изображения в VisualBrush с помощью С#

на самом деле я установил изображение, взятое из ресурсов во время разработки, в файл 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>

и работает нормально. Но (кнопка входа) Я хочу, чтобы при входе пользователя изображение на кнопке (внутри прямоугольника) менялось..

Как я могу сделать?


person ghiboz    schedule 11.02.2013    source источник


Ответы (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 = true; введите здесь описание изображения

person sa_ddam213    schedule 11.02.2013
comment
спасибо!!, у меня есть еще один небольшой вопрос: в моем xaml я использую ResourceDictionary..., что создает конфликт для <VisualBrush x:Key="Loggedin"> и другого... - person ghiboz; 12.02.2013
comment
Содержит ли ResourceDictionary ресурсы с таким же ключом? Вы должны иметь возможность использовать любое имя, которое вы хотите, - person sa_ddam213; 12.02.2013
comment
вот мой ресурс: ` ‹Window.Resources› ‹ResourceDictionary› ‹ResourceDictionary.MergedDictionaries› ‹ResourceDictionary Source=pack://application:,,,/MahApps.Metro;component/Styles/Colours.xaml /› ‹ResourceDictionary Source= pack://application:,,,/MahApps.Metro;component/Styles/Fonts.xaml /› ‹ResourceDictionary Source=pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml /› ` - person ghiboz; 12.02.2013
comment
` ‹ResourceDictionary Source=pack://application:,,,/MahApps.Metro;component/Styles/Accents/Red.xaml /› ‹ResourceDictionary Source=pack://application:,,,/MahApps.Metro;component/ Styles/Accents/BaseLight.xaml /› ‹ResourceDictionary Source=pack://application:,,,/myProject;component/Resources/Icons.xaml /› ‹/ResourceDictionary.MergedDictionaries› ‹/ResourceDictionary› ‹/Window.Resources› ` - person ghiboz; 12.02.2013
comment
Просто попробуйте переименовать их во что-то другое, один из этих файлов xaml должен где-то иметь одинаковые имена ключей. - person sa_ddam213; 12.02.2013
comment
но какое имя? кажется другим - person ghiboz; 12.02.2013
comment
Измените Loggedin на Loggedin1 и NotLoggedin на NotLoggedin1 и посмотрите, поможет ли это. - person sa_ddam213; 12.02.2013
comment
также с loggedin1.. screencast.com/t/XlDLZHsQIIRR строка №17: </ResourceDictionary> и следующая строка - новая строка: <VisualBrush x:Key="Loggedin1"> - person ghiboz; 12.02.2013