表达式混合、项目模板和隐式样式

发布于 2024-11-10 05:31:42 字数 2726 浏览 7 评论 0原文

我遇到了 Blend 未在 DataTemplate 样式隐式中渲染项目的问题。

我已经设置了一个基本项目来复制该问题。下面是 Xaml + ResourceDictionary,供那些目光敏锐的人看看我做错了什么(如果有的话),如果您真的很热衷,可以点击下面的 Zipped 项目的链接。

这是应用程序运行时呈现的内容:

Expected Output

这就是 Blend 呈现的内容:

混合渲染

<Color x:Key="TextColor1">#FF3631C4</Color>

<Style TargetType="{x:Type TextBlock}">
    <Setter Property="TextWrapping" Value="NoWrap"/>
    <Setter Property="TextTrimming" Value="None"/>
    <Setter Property="Foreground">
        <Setter.Value>
            <SolidColorBrush Color="{DynamicResource TextColor1}"/>
        </Setter.Value>
    </Setter>
</Style>

<Canvas x:Name="LayoutRoot" DataContext="{Binding Source={StaticResource SampleDataSource}}">
    <TextBlock Text="Textblock" Canvas.Left="44.954" Canvas.Top="49.305" />
    <TextBlock Text="Textblock 2" Canvas.Left="44.954" Canvas.Top="86.284" />
    <ListBox ItemsSource="{Binding Collection}" Canvas.Left="134.016" Canvas.Top="29.026" Height="154.275" Width="384.575">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Property1}" />
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Canvas>

完整示例项目 (65kb) - WpfApplication2.zip

问题当然可以是通过显式设置样式来解决,但在我的主要项目中这会引起一些头痛。

我在其他帖子上看到了一些评论,认为 Blend 可能有问题,但没有具体的内容。

有什么想法/建议吗?

谢谢!

编辑:

我发现,如果我给我的样式一个显式键,我就可以基于显式创建一个隐式样式,如下所示:

<Style x:Key="TextBlockStyle1" TargetType="{x:Type TextBlock}">
    <Setter Property="TextWrapping" Value="NoWrap"/>
    <Setter Property="TextTrimming" Value="None"/>
    <Setter Property="Foreground">
        <Setter.Value>
            <SolidColorBrush Color="{DynamicResource TextColor1}"/>
        </Setter.Value>
    </Setter>
</Style>

<Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource TextBlockStyle1}" />

然后这使我能够在我的数据模板中添加另一个隐式样式作为资源:

<DataTemplate>
    <DataTemplate.Resources>
        <Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource TextBlockStyle1}"></Style> 
    </DataTemplate.Resources>
    <TextBlock Text="{Binding Property1}" />
</DataTemplate>

这将给出我在我的主要项目中需要的可混合性,但仍然不能完全回答我原来的问题。

I'm having an issue with Blend not rendering items in a DataTemplate styled implicity.

I've setup a basic project to replicate the issue. Below is the Xaml + ResourceDictionary for those with Eagle eyes to see what I'm doing wrong (if anything) and if you're really keen theres a link to the Zipped project below.

This is what renders when the application is run:

Expected Output

and this is what Blend presents:

Blend Rendered

<Color x:Key="TextColor1">#FF3631C4</Color>

<Style TargetType="{x:Type TextBlock}">
    <Setter Property="TextWrapping" Value="NoWrap"/>
    <Setter Property="TextTrimming" Value="None"/>
    <Setter Property="Foreground">
        <Setter.Value>
            <SolidColorBrush Color="{DynamicResource TextColor1}"/>
        </Setter.Value>
    </Setter>
</Style>

<Canvas x:Name="LayoutRoot" DataContext="{Binding Source={StaticResource SampleDataSource}}">
    <TextBlock Text="Textblock" Canvas.Left="44.954" Canvas.Top="49.305" />
    <TextBlock Text="Textblock 2" Canvas.Left="44.954" Canvas.Top="86.284" />
    <ListBox ItemsSource="{Binding Collection}" Canvas.Left="134.016" Canvas.Top="29.026" Height="154.275" Width="384.575">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Property1}" />
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Canvas>

Complete Example Project (65kb) - WpfApplication2.zip

The problem can of course be solved by explictly setting the style, but in my main project this will cause a bit of a headache.

I've seen some comments on other posts around that Blend may have issues but nothing concrete.

Any thoughts / suggestions?

Thanks!

Edit:

I discovered that if I give my style an Explicit Key, I can then create an Implicit Style based on the Explicit like so:

<Style x:Key="TextBlockStyle1" TargetType="{x:Type TextBlock}">
    <Setter Property="TextWrapping" Value="NoWrap"/>
    <Setter Property="TextTrimming" Value="None"/>
    <Setter Property="Foreground">
        <Setter.Value>
            <SolidColorBrush Color="{DynamicResource TextColor1}"/>
        </Setter.Value>
    </Setter>
</Style>

<Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource TextBlockStyle1}" />

This then gives me the ability to add another Implicit Style as a Resource in my DataTemplate:

<DataTemplate>
    <DataTemplate.Resources>
        <Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource TextBlockStyle1}"></Style> 
    </DataTemplate.Resources>
    <TextBlock Text="{Binding Property1}" />
</DataTemplate>

This will then give me the blendability I'll need in my main Project but still doesn't quite answer my original question.

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

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

发布评论

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

评论(1

一场春暖 2024-11-17 05:31:42

首先 Blend 是用 WPF 和 XAML 编写的。
因此 Blend 有自己的应用程序样式,并且由于您的应用程序还定义了全局样式,为了不合并它们,它将以不同的方式应用它们,并且它们用于应用这些样式的方法可能存在错误。

这是我的猜测为什么会发生这种情况。
虽然它不能解决问题,但可能会帮助您找到其他解决方法。

Firstly Blend is written in WPF and XAML.
So Blend has its own application style and as your application also defines global styles, in order not to merge them it will be applying them differently and there is probably a bug in the method they used to apply those styles.

This is my guess why this is happening.
It doesn't solve the problem though, but might help you to find out other workarounds.

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