【问题标题】:wpf - why does this XAML override template not workwpf - 为什么这个 XAML 覆盖模板不起作用
【发布时间】:2010-09-15 23:32:45
【问题描述】:

关于为什么我的 WPF XAML 代码不起作用的任何想法。我正在尝试覆盖 WPFToolkit 图表显示,并采用它们的默认 XAML 并包含在我的 Grid.Resources 部分中作为覆盖的一种方式。具体来说,我想删除图形标记,但这个特定问题涉及通过询问为什么这些特定方法不起作用来澄清我对 XAML 的理解:

a) - 我尝试将 Visibility="Hidden 放在 Grid 元素中,但这似乎不起作用?为什么会这样?

b) 尝试取出标记中的所有行,但这不起作用。为什么会这样?这不应该覆盖的东西。我想知道我的整个覆盖模板是否真的适用于 LineDataPoint? (我确实注意到我在下面的代码中的 LineSeries 覆盖但是确实有效)

XAML 是:

        <!--  charting:LineSeries  -->
        <Style TargetType="chartingToolkit:LineSeries">
            <Setter Property="IsTabStop" Value="False" />
            <Setter Property="PolylineStyle">
                <Setter.Value>
                    <Style TargetType="Polyline">
                        <Setter Property="StrokeThickness" Value="1" />
                    </Style>
                </Setter.Value>
            </Setter>
        </Style>

        <!--  charting:LineDataPoint  -->
        <Style TargetType="chartingToolkit:LineDataPoint">
            <Setter Property="Background" Value="Orange" />
            <Setter Property="BorderBrush" Value="Red" />
            <Setter Property="BorderThickness" Value="1" />
            <Setter Property="IsTabStop" Value="False" />
            <Setter Property="Width" Value="2" />
            <Setter Property="Height" Value="2" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="chartingToolkit:LineDataPoint">
                        <Grid x:Name="Root" Opacity="0" Visibility="Hidden">
                            <Ellipse Stroke="{TemplateBinding BorderBrush}" Fill="{TemplateBinding Background}" Height="30"/>
                            <Ellipse RenderTransformOrigin="0.661,0.321">
                                <Ellipse.Fill>
                                    <RadialGradientBrush GradientOrigin="0.681,0.308">
                                        <GradientStop Color="Green" />
                                        <GradientStop Color="#FFFFFFFF" Offset="1" />
                                    </RadialGradientBrush>
                                </Ellipse.Fill>
                            </Ellipse>
                            <Ellipse x:Name="SelectionHighlight" Opacity="0" Fill="Red" />
                            <Ellipse x:Name="MouseOverHighlight" Opacity="0" Fill="White" />
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

    </Grid.Resources>

    <chartingToolkit:Chart Title="Engine Performance">
        <!-- Power curve -->
        <chartingToolkit:LineSeries
                        Title="Power"
                        ItemsSource="{StaticResource EngineMeasurementCollection}"
                        IndependentValueBinding="{Binding Speed}"
                        DependentValueBinding="{Binding Power}">
            <!-- Vertical axis for power curve -->
            <chartingToolkit:LineSeries.DependentRangeAxis>
                <chartingToolkit:LinearAxis
                                Orientation="Y"
                                Title="Power (hp)"
                                Minimum="0"
                                Maximum="250"
                                Interval="50"
                                ShowGridLines="True"/>
            </chartingToolkit:LineSeries.DependentRangeAxis>
        </chartingToolkit:LineSeries>
        <!-- Torque curve -->
        <chartingToolkit:LineSeries
                        Title="Torque"
                        ItemsSource="{StaticResource EngineMeasurementCollection}"
                        IndependentValueBinding="{Binding Speed}"
                        DependentValueBinding="{Binding Torque}">
            <!-- Vertical axis for torque curve -->
            <chartingToolkit:LineSeries.DependentRangeAxis>
                <chartingToolkit:LinearAxis
                                Orientation="Y"
                                Title="Torque (lb-ft)"
                                Minimum="50"
                                Maximum="300"
                                Interval="50"/>
            </chartingToolkit:LineSeries.DependentRangeAxis>
        </chartingToolkit:LineSeries>
        <chartingToolkit:Chart.Axes>
            <!-- Shared horizontal axis -->
            <chartingToolkit:LinearAxis
                            Orientation="X"
                            Title="Speed (rpm)"
                            Interval="1000"
                            ShowGridLines="True"/>
        </chartingToolkit:Chart.Axes>
    </chartingToolkit:Chart>
</Grid>

编辑:

附言。我把它归结为模板没有被拾取的事实,它似乎在下面的代码中 - 但它应该被拾取,不是吗?即我没有针对

设置 x:key
<Window x:Class="MyInternetUsage.EnginePerformance"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:chartingToolkit="clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=System.Windows.Controls.DataVisualization.Toolkit" xmlns:local="clr-namespace:DataVisualizationDemos" xmlns:datavis="clr-namespace:System.Windows.Controls.DataVisualization;assembly=System.Windows.Controls.DataVisualization.Toolkit" Title="EnginePerformance" Height="277" Width="371">
    <Grid>
        <Grid.Resources>
            <local:EngineMeasurementCollection x:Key="EngineMeasurementCollection"/>

            <!--  charting:LineDataPoint  -->
            <Style TargetType="chartingToolkit:LineDataPoint">
                <Setter Property="Background" Value="Orange" />
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="chartingToolkit:LineDataPoint">

                            <Grid
                                Width="30"
                                Height="30"
                                Background="{TemplateBinding Background}"/>

                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </Grid.Resources>

        <chartingToolkit:Chart Title="Engine Performance">
            <!-- Power curve -->
            <chartingToolkit:LineSeries
                            Title="Power"
                            ItemsSource="{StaticResource EngineMeasurementCollection}"
                            IndependentValueBinding="{Binding Speed}"
                            DependentValueBinding="{Binding Power}">

            </chartingToolkit:LineSeries>

        </chartingToolkit:Chart>
    </Grid>
</Window>

谢谢

【问题讨论】:

    标签: c# .net wpf xaml controltemplate


    【解决方案1】:

    LineDataPoint 可能不是可模板化的,或者至少不是完全可模板化的,因为它的许多样式属性是在内部定义的。

    您可以设置默认样式,这对于框架中的“无外观”控件非常有效,因为它们在设计时考虑到了模板(因此使用TemplateBinding s),但是如果一个控件,例如,在内部声明它的背景是紫色的,你不能用样式覆盖它。

    也有可能您看到的实际上并不是控件本身的背景,而是内部组成控件的背景。如果设计的组件没有“通过”该属性,则在控件本身上设置值不会影响您看到的内部部分。

    最后,Chart 可以为LineDataPoint 定义默认样式。在比您的网格资源更窄的范围内,这将具有优先权。

    如果您可以访问源代码,则可以解决此问题;如果没有组件的源代码或良好的文档,这只是一个令人沮丧的试错猜谜游戏。

    【讨论】:

    • 谢谢 - 我喜欢你的最后一句话 - 让我感觉好一点,到目前为止还不能把它搞清楚 :) 我确实从讨论板上得到了一些建议,说要尝试以下内容,所以我认为这个建议将基于对控件是如何构建的知识?建议 = 您可以使用根视觉对象的 Binding on Visibility 属性(对于 LineDataPoint):
    • @Greg 输出窗口中有什么东西吗?绑定或数据错误?
    • 看不到和绑定错误。确实看到一些“已加载”行项目和 4 个“第一次机会异常”错误,这些错误是: PresentationFramework.dll 中发生类型为“System.NotSupportedException”的第一次机会异常 类型为“System.Xaml.XamlObjectWriterException”的第一次机会异常'发生在 System.Xaml.dll 类型“System.NotSupportedException”的第一次机会异常发生在 PresentationFramework.dll 类型“System.Xaml.XamlObjectWriterException”的第一次机会异常发生在 System.Xaml.dll
    • @Greg 你提到的讨论的链接是什么?
    猜你喜欢
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 2018-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    相关资源
    最近更新 更多