Стиль переплета в страницах - PullRequest
0 голосов
/ 30 сентября 2018

У меня есть Window1 и есть 2 страницы входа и регистрации.На странице есть CheckBox, для него 2 стиля из App.xaml: LightCheckBoxStyle и DarkCheckBoxStyle.И я бы хотел, чтобы стиль зависел от значения свойства bool LightStyle.Т.е. если LightStyle = true;тогда CheckBox - это LightCheckBoxStyle и наоборот, если false, то DarkCheckBoxStyle.

App.xaml

<Application x:Class="COP.App"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:ModernButton="clr-namespace:ModernButton;assembly=ModernButton"
         xmlns:local="clr-namespace:COP"
         xmlns:local1="clr-namespace:COP.ViewModel"
         StartupUri="MainWindow.xaml">
<Application.Resources>
    <Style x:Key="DefaultCheckBoxStyle" TargetType="local:UserCheckBox">
        <Setter Property="BorderBrush" Value="#707070"/>
        <Setter Property="FontSize" Value="15"/>
        <Setter Property="Width" Value="30"/>
        <Setter Property="Height" Value="30"/>
        <Setter Property="Margin" Value="0,10,0,0"/>
        <Setter Property="BorderThickness" Value="2"/>
        <Setter Property="Foreground" Value="Gray"/>
        <Setter Property="Background" Value="#C3C3C3"/>
        <Style.Triggers>
            <DataTrigger Binding="{Binding LightStyle}" Value="True">
                <Setter Property="Background" Value="White"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
    <Style x:Key="LightCheckBoxStyle" TargetType="local:UserCheckBox" BasedOn="{StaticResource DefaultCheckBoxStyle}">
        <Setter Property="Background" Value="White"></Setter>
    </Style>
    <Style x:Key="DarkCheckBoxStyle" TargetType="local:UserCheckBox" BasedOn="{StaticResource DefaultCheckBoxStyle}">
        <Setter Property="Background" Value="#C3C3C3"></Setter>
    </Style>
</Application.Resources>

Login.xaml

<Page x:Class="COP.Pages.Login"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
  xmlns:local="clr-namespace:COP.Pages"
  xmlns:local1="clr-namespace:COP"
  mc:Ignorable="d" 
  d:DesignHeight="450" d:DesignWidth="400"
  Title="Login">
<Page.Resources>
    <local1:BoolToStyle x:Key="Convert"></local1:BoolToStyle>
</Page.Resources>
<Grid Height="Auto">      
        <local1:UserCheckBox Style="{StaticResource LightCheckBoxStyle}" x:Name="checkBox"></local1:UserCheckBox>
    </Grid>
</Grid>

MainViewModel.cs

class MainViewModel : INotifyPropertyChanged
{
    private Page Login;
    private Page Register;

    private bool _lightStyle = true;
    public bool LightStyle
    {
        get { return _lightStyle; }
        set { _lightStyle = value; OnPropertyChanged(); }
    }

    private Page _currentPage;
    public Page CurrentPage
    {
        get { return _currentPage; }
        set { _currentPage = value; OnPropertyChanged(); }
    }

    private double _frameOpacity;
    public double FrameOpacity
    {
        get { return _frameOpacity; }
        set { _frameOpacity = value; OnPropertyChanged(); }
    }

    public MainViewModel()
    {
        Login = new Pages.Login();
        Register = new Pages.Register();

        FrameOpacity = 1;
        CurrentPage = Login;
        LightStyle = true;
    }

    public async void SlowOpacity(string page)
    {
        await Task.Factory.StartNew(() =>
        {
            for (double i = 1.0; i > 0.0; i -= 0.1)
            {
                FrameOpacity = i;
                Thread.Sleep(50);
            }
            if (page == "Login")
                CurrentPage = Login;
            else
                CurrentPage = Register;
            for (double i = 0.0; i < 1.1; i += 0.1)
            {
                FrameOpacity = i;
                Thread.Sleep(50);
            }
        });
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

Если вам нужно, я все равно могу выложить код.BoolToStyle пуст, потому что я не знаю, как его реализовать.

UserCheckBox.xaml.cs

public partial class UserCheckBox : UserControl, INotifyPropertyChanged
{
    public UserCheckBox()
    {
        InitializeComponent();
        MouseLeftButtonUp += delegate (object sender, MouseButtonEventArgs e) { IsChecked = !IsChecked; };
    }

    #region
    private bool _IsChecked = false;
    #endregion

    #region
    public bool IsChecked
    {
        get { return _IsChecked; }
        private set { _IsChecked = value; OnPropertyChanged("IsChecked"); }
    }
    #endregion

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string name) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}

Login.xaml.cs

public partial class Login : Page
{
    public Login()
    {
        InitializeComponent();
        DataContext = Application.Current.MainWindow.DataContext;
    }

}

1 Ответ

0 голосов
/ 30 сентября 2018

Triggers есть в WPF, чтобы иметь условные сеттеры в стиле.

Для вашего сценария вы можете установить для свойства Background по умолчанию значение #C3C3C3 и изменить его на White, когда LightStyleis True.

Использовать стиль ниже -

     <Style x:Key="DefaultCheckBoxStyle" TargetType="local:UserCheckBox">
        <Setter Property="BorderBrush" Value="#707070"/>
        <Setter Property="FontSize" Value="15"/>
        <Setter Property="Width" Value="30"/>
        <Setter Property="Height" Value="30"/>
        <Setter Property="Margin" Value="0,10,0,0"/>
        <Setter Property="BorderThickness" Value="2"/>
        <Setter Property="Foreground" Value="Gray"/>
        <Setter Property="Background" Value="#C3C3C3"/>
        <Style.Triggers>
            <DataTrigger Binding="{Binding LightStyle}" Value="True">
                <Setter Property="Background" Value="White"/>
            </DataTrigger>                
        </Style.Triggers>
    </Style>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...