wpf - 为什么这个XAML覆盖模板不起作用

时间:2010-09-15 23:32:45

标签: c# .net wpf xaml controltemplate

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

a) - 我尝试将Visibility =“隐藏在网格元素中,但这似乎不起作用?为什么会这样?”

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>

编辑:

PS。我已经把它归结为模板没有被拾取它看起来在下面的代码 - 但它应该被拿起来没有?即我没有设置x:键反对

<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>

感谢

1 个答案:

答案 0 :(得分:2)

由于内部定义了许多样式属性,因此LineDataPoint可能无法模板化或至少不完全。

您可以像设置一样设置默认样式,这对于作为框架一部分的“无视”控件非常有效,因为它们在设计时考虑了模板(因此使用{{1例如,如果控件在内部声明其背景为紫色,则不能使用样式覆盖它。

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

最后,TemplateBinding可能会为Chart定义默认样式。在比您的网格资源更窄的范围内,这将优先。

如果您有权访问该来源,您可以将其排除在外;没有该组件的来源或良好的文档,它只是一个令人沮丧的试错猜谜游戏。