8

リソース ディクショナリで定義されたスタイルをすべてのテキスト ボックスに適用しています。

<Style TargetType="TextBlock">
        <Setter Property="TextBlock.FontSize" Value="{Binding Source={StaticResource ApplicationUserSettings}, Path=fontSize, Mode=OneWay}" />
        <Setter Property="TextBlock.TextWrapping" Value="Wrap" />
        <Setter Property="TextBlock.VerticalAlignment" Value="Center"/>
        <Setter Property="Background" Value="Transparent"/>
        <Setter Property="TextBox.FontFamily" Value="{Binding Source={StaticResource ApplicationUserSettings}, Path=fontName, Mode=OneWay}"/>
    </Style>\

fontsize プロパティと fontstyle プロパティは、iNotifyPropertyChanged を実装する特別なユーザー設定クラスにバインドされます。これにより、フォント サイズと fontfamily の変更がアプリケーション全体に即座に反映されます。

ただし、作成した UserControl (皮肉なことに、ユーザーがフォント設定をカスタマイズできる画面) では、フォント サイズと fontfamily を静的のままにしたいと考えています。何を試しても、グローバル フォント設定は、ユーザー コントロールで設定した内容を上書きします。

<UserControl x:Class="ctlUserSettings"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:R2D2" Height="400" Width="600">

<Grid>

    <Grid.Resources>
        <Style x:Key="tbxStyle" TargetType="TextBox">
            <Style.Setters>
                <Setter Property="FontSize" Value="14"/>
                <Setter Property="FontFamily" Value="Tahoma"/>
            </Style.Setters>
        </Style>

...など...

         <StackPanel Margin="139,122.943,41,0" Orientation="Horizontal" Height="33" VerticalAlignment="Top">
            <TextBox Style="{x:Null}" FontSize="13" FontFamily="Tahoma" HorizontalAlignment="Left" MaxWidth="500" MinWidth="350" Name="txtReaderPath" Height="Auto" VerticalAlignment="Top" />
            <TextBox Style="{x:tbxStyle}" Margin="15,0,0,0" HorizontalAlignment="Left" Name="txtPath" Width="43" Height="23" VerticalAlignment="Top">(some text)</Button>
        </StackPanel>

Style を {x:Null} に設定し、インラインでカスタム フォント サイズを設定し、このコントロールのリソースにスタイルを設定しようとしました。リソース ディクショナリのスタイルよりも優先されるものはありません。

ご覧のとおり、上記の XAML サンプルで試したすべてのことを散りばめたものを示しています...

私は何が欠けていますか?

4

2 に答える 2

2

もう 1 つの方法は、次のように UserControl に空のスタイルを追加することです。

<UserControl.Resources>
        <Style TargetType="TextBlock" />
</UserControl.Resources>

これにより、グローバル スタイルがブロックされます。これを StackPanel リソースに追加して、よりきめ細かい制御を行うこともできます。

于 2010-06-24T13:02:19.263 に答える
1

わかりました、今何が起こっているかわかりました。

UserControl のコンストラクターで、何が起こるかを確認するために .Style=Nothing を設定しようとさえしました...そして私のグローバル スタイルはまだ来ていて、それ自体を適用していました。

コンストラクターの実行後にグローバル スタイルがコントロールに適用されていると想定する必要があり、とにかくグローバル スタイルが侵入します。最後に、「グローバル」スタイルを、必要なものだけに影響する場所に移動しただけです。

不便ですが、少なくともプロジェクトを進めることができます

于 2010-03-26T16:39:50.540 に答える