2013-08-19 7 views
1

런타임시 기본 스타일 속성을 사용하려고합니다. 예 : 나는 사용자가 폰트 크기와 폰트 패밀리 등을 바꿀 수있는 설정 페이지를 가지고있다. 이것들은 모두 공통 속성이다. 그래서 저는이 모든 기본 속성들을 정의한 구조를 가지고 있습니다. 이제 글꼴 크기를 11px에서 14px로 변경하면 응용 프로그램의 모든 요소가이 변경 사항을 상속해야합니다.기본 스타일을 동적으로 변경하십시오.

문제는 모든 속성을 저장하는 기본 스타일을 수정할 수 없다는 것입니다. 코드 아래

내 기본 스타일을 보여줍니다 지금

<Style x:Key="BaseStyle"> 
     <Setter Property="Control.FontFamily" Value="Arial"></Setter> 
     <Setter Property="Control.FontSize" Value="11px"/> 
     <Setter Property="Control.Foreground" Value="Red"/> 
</Style> 

I가이 기본 스타일에서 상속 다른 스타일 :

<Style TargetType="TextBox" BasedOn="{StaticResource BaseStyle}"> 
     <Setter Property="Control.Background" Value="{DynamicResource NormalBrush}"/> 
</Style> 

내가 글꼴 크기 변화에 대한 콤보 박스가 응용 프로그램에서 :

<ComboBox Height="23" HorizontalAlignment="Left" Name="comboBox2" SelectedValue="FontSizeValue" Style="{x:Null}" Width="92"> 
         <ComboBoxItem Content="12px"/> 
         <ComboBoxItem Content="13px"/> 
         <ComboBoxItem Content="14px"/> 
         <ComboBoxItem Content="15px"/> 
</ComboBox> 

이제 응용 프로그램에서이 콤보 상자의 값을 선택하면 기본 스타일을 업데이트하십시오. 나는 할 수 없다. 내가 어떻게 이것을 달성 할 수 있는지에 대한 제안. 모든 속성 변경은 동적으로 발생해야합니다.

+2

MSDN 말한다 : 스타일이 적용되면, 그것은 밀봉 아래

// your namespace.Properties.Settings.Default.your name of property DynamicStyleHelp.Properties.Settings.Default.MyColor = "Red"; 

이 완벽한 예입니다 변경할 수 없습니다. 이미 적용된 스타일을 동적으로 변경하려면 기존 스타일을 대체 할 새 스타일을 만들어야합니다. – Nitesh

+0

예. 지금 당면하고있는 문제입니다. 우리가 똑같은 일을 할 수 없게 만들까요? 나는 글꼴 크기의 속성 만 변경하고 다른 10 개의 속성은 그대로 유지해야합니다. 그러면 새 스타일을 만들고 현재 스타일을 덮어 쓰면 모든 기본값이 손실됩니다. 다른 문제는 없습니까? – ds345

답변

1

기본 스타일은이 유형의 컨트롤에 대해 변경되지 않는 값이어야합니다. 변경해야하는 값은 기본 스타일을 상속 할 수있는 별도의 스타일로 지정됩니다. 예 :

<Window.Resources> 
    <!-- Main style for all controls --> 
    <Style x:Key="BaseStyle" TargetType="{x:Type Control}"> 
     <Setter Property="FontFamily" Value="Arial" /> 
     <Setter Property="FontSize" Value="11px" /> 
     <Setter Property="Foreground" Value="Black" /> 
     <Setter Property="Width" Value="200" /> 
     <Setter Property="Height" Value="25" /> 
    </Style> 

    <!-- This style inherits all the settings from the base style, but set the background --> 
    <Style x:Key="DefaultBaseStyle" BasedOn="{StaticResource BaseStyle}" TargetType="{x:Type TextBox}"> 
     <Setter Property="Background" Value="Green" /> 
    </Style> 

    <!-- This style inherits only the width and height --> 
    <Style x:Key="NotDefaultBaseStyle" BasedOn="{StaticResource BaseStyle}" TargetType="{x:Type TextBox}"> 
     <Setter Property="Background" Value="Black" /> 
     <Setter Property="Foreground" Value="White" /> 
     <Setter Property="FontFamily" Value="Courier New" /> 
    </Style> 
</Window.Resources> 

<Grid> 
    <StackPanel> 
     <TextBox Style="{StaticResource DefaultBaseStyle}" Text="Default base style" Margin="0,10,0,0" /> 
     <TextBox Style="{StaticResource NotDefaultBaseStyle}" Text="Not default base style" Margin="0,10,0,0" /> 
    </StackPanel> 
</Grid> 

Output

enter image description here

당신은 아마도 그 공통점을 선택하여 각각에 대한 기본 스타일을 생성하는 것이 좋습니다, 컨트롤의 다른 종류가 많은 경우 (너비, 높이, 정렬). 예를 들어 Button, TextBox 등의 기본 스타일은 기본과 크게 다르며 기본을 상속하는 별도의 스타일을 만들어야합니다.

당신이 스타일을 기반으로 할 경우

EDIT:

는 이러한 매개 변수와 설정을 만들 필요가 사용자의 선택에 따라 변경. 따라서, 프로젝트의 설정으로 이동 :

Project -> Properties -> Parameters

는 이름 MyColor와 문자열의 유형을 설정을 만듭니다. 설정 스타일과 연결하려면 다음을 작성해야합니다.

xmlns:properties="clr-namespace:DynamicStyleHelp.Properties" 

<Setter Property="Background" Value="{Binding Source={x:Static properties:Settings.Default}, Path=MyColor, Mode=TwoWay}" /> 

이제 setter가 설정의 값을 참조합니다.코드 뒤에 속성을 변경 :

XAML

<Window x:Class="DynamicStyleHelp.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:properties="clr-namespace:DynamicStyleHelp.Properties" 
    Title="MainWindow" Height="350" Width="525" 
    WindowStartupLocation="CenterScreen"> 

<Window.Resources> 
    <Style x:Key="BaseStyle" TargetType="{x:Type Control}"> 
     <Setter Property="FontFamily" Value="Arial" /> 
     <Setter Property="FontSize" Value="11px" /> 
     <Setter Property="Background" Value="{Binding Source={x:Static properties:Settings.Default}, Path=MyColor, Mode=TwoWay}" /> 
     <Setter Property="Width" Value="200" /> 
     <Setter Property="Height" Value="25" /> 
    </Style> 

    <Style x:Key="DefaultBaseStyle" BasedOn="{StaticResource BaseStyle}" TargetType="{x:Type TextBox}"> 
     <Setter Property="Foreground" Value="Black" /> 
    </Style> 

    <Style x:Key="NotDefaultBaseStyle" BasedOn="{StaticResource BaseStyle}" TargetType="{x:Type TextBox}"> 
     <Setter Property="Foreground" Value="White" /> 
     <Setter Property="FontFamily" Value="Courier New" /> 
    </Style> 
</Window.Resources> 

<Grid> 
    <StackPanel> 
     <TextBox Style="{StaticResource DefaultBaseStyle}" Text="Default base style" Margin="0,10,0,0" /> 
     <TextBox Style="{StaticResource NotDefaultBaseStyle}" Text="Not default base style" Margin="0,10,0,0" /> 

     <Button Name="ChangeButton" Width="100" Height="30" Content="ChangeButton" Margin="0,10,0,0" Click="ChangeButton_Click" /> 
    </StackPanel> 
</Grid> 
</Window> 

Code behind

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void ChangeButton_Click(object sender, RoutedEventArgs e) 
    { 
     DynamicStyleHelp.Properties.Settings.Default.MyColor = "Red"; 
    } 
} 
+0

UI에서 일부 버튼 클릭 또는 일부 이벤트에서이를 수행하고 싶습니다. 그게 가능하니? 나는 setter 가치에서 할 수있는 바인딩을 보았다. 그러나 나는 그들을 어떻게 사용하는지 이해할 수 없다. – ds345

+0

@Deeksha : 필요한 것을 자세하게 쓸 수 있습니까? 이벤트로 스타일을 어떻게 처리할까요? –

+0

나는 내 질문을 편집했다. 확인해주십시오. 나는 그것이 더 분명하지 않다는 것을 희망한다. 내 문제는 기본 스타일 자체를 변경하는 것을 포함 할 수있는 스타일을 동적으로 업데이트하는 것입니다. 그래서 나는 setter 속성의 값에 바인딩하는 메소드를 kwn했다. 그러나 나는 그것을 어떻게 사용하는지 이해할 수 없다. – ds345

관련 문제