【问题标题】:Apply a style to all textbox in my WPF application将样式应用于我的 WPF 应用程序中的所有文本框
【发布时间】:2017-08-28 03:38:42
【问题描述】:

我想将样式(字体大小)应用到我的所有文本框时遇到问题,无论它们在哪里。

我当然找到了这些链接: Apply an application-level style to all textboxes

How to target all controls (WPF Styles)

但这对我不起作用。

第一个更好,因为您不需要使用键,而是转到所有文本框。

在我的 app.xml 中,我已经将样式应用于所有控件(应用颜色),所以我尝试了类似的方法(即使这对我来说还不够,因为这些样式并非无处不在) :

<Style x:Key="Type1Data" TargetType="{x:Type Control}">
    <Setter Property="Background" Value="#FEE9E6"/>
    <Style.Resources>
        <Style TargetType="{x:Type TextBox}">
            <Setter Property="FontSize" Value="50" />
        </Style>
    </Style.Resources>
</Style>

正如我所说,我也尝试过,但不起作用。

<Style TargetType="{x:Type TextBox}">
                <Setter Property="FontSize" Value="50" />
            </Style>

知道我的问题是什么以及如何实现我想要的吗? 我能找到的所有问题都让我回到相同的代码,但没有找到一个有效的代码。

编辑:这是我当前的 app.xaml

<Application x:Class="myApp.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:myApp"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
    <Style TargetType="TextBox"><!-- tried adding those 3 lines too-->
        <Setter Property="FontSize" Value="50"/>
    </Style>
        <Style x:Key="Type1Data" TargetType="{x:Type Control}">
            <Setter Property="Background" Value="Blue"/>
        </Style>
        <Style x:Key="Type2Data" TargetType="{x:Type Control}">
            <Setter Property="Background" Value="White"/>
        </Style>
        <Style x:Key="Type3Data" TargetType="{x:Type Control}">
            <Setter Property="Background" Value="Green"/>
        </Style>
    </Application.Resources>
</Application>

正如我所说,当前的样式并没有覆盖整个应用程序(我添加了需要的键,或者什么都没有)

edit : 如果我直接(作为第二个设置器)将字体大小添加到 Type 1,2 或 3,则适用字体大小。所以看起来,除了 app.xml 中的 3 之外,没有其他样式可以应用。

<Setter Property="FontSize" Value="50" />

应该获得不同文本框大小的代码示例(一个已经有样式,一个没有),它们在网格中:

<com:ViewControl x:Class="myApp.View.ViewControl"
             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:syncfusion="http://schemas.syncfusion.com/wpf"  
             xmlns:input="http://schemas.syncfusion.com/wpf"
             xmlns:local="clr-namespace:myApp.View"
             xmlns:com="clr-namespace:RAPINF.PLL.Common;assembly=myApp.Common"
             xmlns:entities="clr-namespace:myApp.Entities;assembly=myApp.Entities"
             mc:Ignorable="d" 
             d:DesignHeight="500" d:DesignWidth="700">

<TextBox Style="{StaticResource Type1Data}" Grid.Row="0" Grid.Column="1" Grid.ColumnSpan="2" Margin="2" Text="{Binding Data.Name}" VerticalAlignment="Center" />

        <TextBox Grid.Row="0" Grid.Column="1" Margin="2" Text="{Binding Data.Name}" VerticalAlignment="Center" Grid.ColumnSpan="3" />

编辑:添加我有时使用并且有效的弹出窗口的代码

<sf:RibbonWindow x:Class="namespace:myApp.Common.DetailViewWindow"
                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:sf="http://schemas.syncfusion.com/wpf" 
                xmlns:self="clr-namespace:myApp.Common"
                mc:Ignorable="d" 
                d:Height="300" d:Width="400" 
                WindowStartupLocation="CenterOwner"
                >
</sf:RibbonWindow>

我的用户控件如何添加到 Dock 中:

public void AddView(UserControl View, string sTitle, DockState docState)
{
    int Width = 800;
    int Height = 400;

    DockingManager.SetHeader(View, sTitle);
    DocumentContainer.SetMDIBounds(View, new Rect(30, 30, Width, Height));
    DockingManager.SetState(View, docState);
    DockingManager.SetShowCloseMenuItem(View, true);
    DockingManager.SetDesiredWidthInDockedMode(View, Width);

    DockManager.Children.Add(View);
    ActivateView(View);
}

如果我使用扩展坞,我之前会这样做:

ApplicationContext.Current.AddView(View, DockState.Document);

和一个弹出窗口,几乎一样:

    DetailViewWindow dlg = new DetailViewWindow(View);
    dlg.ShowDialog();

因为,这两个代码与相同的视图一起使用(是的,完全相同),那么我猜问题来自于在 Dock 中添加视图,而不是在弹出窗口中。

码头管理器是否强制我使用钥匙?

感谢您的帮助。

【问题讨论】:

  • 你能告诉我们你的 App.xaml 吗?
  • 请提供您的问题的最小、完整和可验证的示例:stackoverflow.com/help/mcve
  • @MightyBadaboom 已添加:由于我展示的内容不多,因此我没有添加全部内容。 mm8:我提供了 app.xml,但除此之外,我展示了我尝试过的所有内容,结果是,我的文本框的字体大小上没有任何内容。
  • 为什么您希望所有的 TextBox 都具有 Type1Data、Type2Data 和 Type3Data 样式?您应该在 App.xaml 中添加一个 TargetType 为 TextBox 的隐式样式(没有 x:Key)。
  • @mm8 这只是我尝试过的一些事情。隐含的意思是: ?我已经尝试过了(编辑代码)。如果没有,你能解释更多吗?我不习惯那些全局样式。

标签: wpf xaml


【解决方案1】:

我无法重现您的问题。我可以向您展示一个工作示例。也许它可以帮助您找到问题。

App.xaml

<Application x:Class="WpfApplication2.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WpfApplication2"
             StartupUri="MainWindow.xaml">
<Application.Resources>
        <Style TargetType="{x:Type TextBox}">
            <Setter Property="FontSize"
                    Value="50" />
        </Style>
    </Application.Resources>
</Application>

MainWindow.xaml

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication2"
        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
        mc:Ignorable="d"
        Title="MainWindow"
        Name="MyWindow"
        SizeToContent="WidthAndHeight">
    <TextBox Width="150"/>
</Window>

输出

【讨论】:

  • 是的,这是我找到的代码(请参阅我的问题的链接)。这正是我的问题:什么应该有效,遗憾的是没有。
  • 就像mm8说的。您必须提供我们可以重现问题的最小样本。否则几乎是不可能的。也许在其他地方有一种样式会覆盖 App.xaml 中的样式。
  • 添加了一个精度:如果我直接添加到 Type 1,2 或 3,则应用字体大小(样式中的第二个设置器),它可以工作,所以除了 Type1,2 或 3 之外什么都没有这似乎适用。而且由于它不使用 Fontsize...但是由于这 3 种样式并不无处不在,我需要其他的。
  • 我明白你的意思,但有些事情必须干涉。否则它会起作用。这就是为什么分开问题是一个好的开始。取决于你的项目的大小。有时它有助于删除其他所有内容(逐步)以检查问题所在。使用版本控制系统时,您可以在发现问题后恢复。
【解决方案2】:

我的造型也没有问题。但我通常将我的东西分成不同的字典,用于不同的控件,并从我自己的一些类中派生出来。我还定义了一种样式并为其分配了一个“x:Key”名称。这就像说我有一个带有这个键名的类,我希望它看起来像这样。然后,一旦我开始工作,我会参加最后一堂课,并说根据定义的键使用你的风格......话虽如此,这里是 App.xaml 的剥离基础

<Application.Resources>
    <Style TargetType="TextBox" x:Key="STextBox">
        <Setter Property="FontSize" Value="50"/>
        <Setter Property="FontFamily" Value="WingDings" />
    </Style>

    <Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource STextBox}" />
</Application.Resources>

我可以定义关于我的基本样式“STextBox”的各种事情(通过 x:Key)。但之后,我通过 x:Key 使用基于样式的目标设置样式。我认为您缺少的关键是目标必须是 {x:Type TextBox}。

如果您查看顶部的 xmlns 标头,例如

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

“x=”是它获取控件类型的库的别名。通过你一般地声明

TargetType="TextBox"

您没有专门与 CLASS TYPE 相关联。

然后在我的主窗口(以及应用程序的其他任何地方)中,我的主网格中有这个

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="80" />
        <RowDefinition Height="80" />
        <RowDefinition Height="80" />
    </Grid.RowDefinitions>

    <TextBox Grid.Row="0" Text="Testing" />
    <TextBox Grid.Row="1" Text="Another Line" />
    <TextBox Grid.Row="2" Text="Last" />

</Grid>

它们都可以正常工作。您还可以将默认颜色、大小、字体系列、边距等更改为基本样式,并且所有这些都将更改,而无需显式引用每个控件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-25
    相关资源
    最近更新 更多