BasedOn="{StaticResource {x:Type TextBox}}"在代码隐藏风格

发布于 2024-10-20 17:12:01 字数 588 浏览 1 评论 0 原文

如何在代码后面设置以下内容?

<Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}">

我正在使用合并在 App.xaml 中的主题。它对所有控件都适用,但是当我为某些东西定义样式时,例如 TextBox,主题样式不会被拾取,除非我像上面那样使用 BasedOn ,而不是它获取默认的 TextBox 样式。

现在我正在后面的代码中创建一个 DataGridTextColumn ,但我无法让 BasedOn 部分适用于 EditingElementStyle

Style editingStyle = new Style(typeof(TextBox));
editingStyle.BasedOn = ...?;

有什么建议吗?另外,有没有办法在不使用 BasedOn 的情况下获取主题样式而不是应用默认样式?

谢谢

How can you set the following in code behind?

<Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}">

I'm using a Theme merged in App.xaml. It works great for all Controls but when I define a Style for something, e.g. TextBox, the Theme Style doesn't get picked up unless I use BasedOn like above, instead it gets the default TextBox Style.

Now I'm creating a DataGridTextColumn in code behind and I can't get the BasedOn part to work for the EditingElementStyle

Style editingStyle = new Style(typeof(TextBox));
editingStyle.BasedOn = ...?;

Any suggestions? Also, is there any way to get the Theme Style instead of the default Style applied without using BasedOn?

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

滴情不沾 2024-10-27 17:12:02

我喜欢 Pavlo Glazkov 的答案,但它无法编译。

FindResource 是 (非静态)FrameworkElement 的成员
需要识别搜索请求的上下文。

所以我推荐这个:

style.BasedOn = (Style)frameworkElement.FindResource(typeof(TextBox));

I like the answer of Pavlo Glazkov, but it does not compile.

FindResource is (non-static) member of FrameworkElement.
It is required to identify the context of the search request.

So I recommend this:

style.BasedOn = (Style)frameworkElement.FindResource(typeof(TextBox));
倚栏听风 2024-10-27 17:12:02

这是此问题几年后发生的一篇文章,提供了一种从 XAML 引用主题的功能方法。
根据https://stackoverflow.com/a/24286059/5104896

首先 - 定义XAML资源字典,其中包含资源的 x:class 标识符以及 x:Key

ResourceDictionary x:Class="YourNameSpaceHere.DataGridCellTemplates"

<Style x:Key="ValidationError_TextBox" TargetType="{x:Type TextBox}">
    <Setter Property="Validation.ErrorTemplate" Value="{StaticResource ValidationErrorTempate}" />
</Style>

第二 - 创建一个.cs 文件来初始化资源类。

using System.Windows;

namespace YourNameSpaceHere
{
    public partial class DataGridCellTemplates : ResourceDictionary
    {
        public DataGridCellTemplates()
        {
            InitializeComponent();
        }
    }
}

最后 - 来自您的代码的参考

using YourNameSpaceHere;
....
var res = new DataGridCellTemplates();
Style test = res["ValidationError_TextBox"] as Style;

Here's a post that occurred a few years after this question and provides a functional way to reference theme from XAML.
Per https://stackoverflow.com/a/24286059/5104896

First - Define the XAML resource dictionary with an x:class identifier along with an x:Key of your resource

ResourceDictionary x:Class="YourNameSpaceHere.DataGridCellTemplates"

<Style x:Key="ValidationError_TextBox" TargetType="{x:Type TextBox}">
    <Setter Property="Validation.ErrorTemplate" Value="{StaticResource ValidationErrorTempate}" />
</Style>

Second - Create a .cs file that will initialize the resource class.

using System.Windows;

namespace YourNameSpaceHere
{
    public partial class DataGridCellTemplates : ResourceDictionary
    {
        public DataGridCellTemplates()
        {
            InitializeComponent();
        }
    }
}

Lastly - Reference from you code

using YourNameSpaceHere;
....
var res = new DataGridCellTemplates();
Style test = res["ValidationError_TextBox"] as Style;
倦话 2024-10-27 17:12:01

试试这个:

editingStyle.BasedOn = (Style) FindResource(typeof (TextBox))

我不知道如何在不指定 BasedOn 的情况下使其应用主题样式。如果有这样的方法的话我也想知道...

Try this:

editingStyle.BasedOn = (Style) FindResource(typeof (TextBox))

And I don't know any way how you can make it apply the Theme style without specifying BasedOn. If there is such a way, I would like to know it too...

谜兔 2024-10-27 17:12:01

这应该可行:

Style baseStyle = new Style(typeof(TextBox));
Style editingStyle = new Style(typeof(TextBox));
editingStyle.BasedOn = baseStyle;

您也可以在构造函数中执行此操作:

Style editingStyle = new Style(typeof(TextBox), baseStyle);

This should work:

Style baseStyle = new Style(typeof(TextBox));
Style editingStyle = new Style(typeof(TextBox));
editingStyle.BasedOn = baseStyle;

You can also do it in the constructor:

Style editingStyle = new Style(typeof(TextBox), baseStyle);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文