簡體   English   中英

在代碼中使用在xaml中聲明的自定義`Style`會引發運行時錯誤

[英]Using in code-behind a custom `Style`, declared in xaml, throws run-time error

我在xaml中聲明了我需要使用的樣式,並在后面的代碼中將其應用於用戶控件,當我兩次使用相同樣式時,會拋出以下錯誤:

元素已具有邏輯父級。 必須先將其與舊的父級分離,然后再附加到新的父級。

我究竟做錯了什么? 我需要在后面的代碼中創建相同用戶控件類型的多個控件,並對其應用一個和相同的Style

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:dxdo="http://schemas.devexpress.com/winfx/2008/xaml/docking"
    xmlns:s="http://schemas.abtsoftware.co.uk/scichart"
    x:Class="MyChartControl.MainWindow"
    Title="MainWindow" Height="655" Width="1020">

<Window.Resources>

   <Style x:Key="SciChartSurfaceStyle" TargetType="{x:Type s:SciChartSurface}">

        <Setter Property="XAxis">
            <Setter.Value>
                <s:DateTimeAxis Visibility="Visible"
                                TextFormatting="dd/MM/yyyy"
                                SubDayTextFormatting="dd/MM/yyyy HH:mm:ss.fff"
                                GrowBy="0.02, 0.02"/>      
            </Setter.Value>
        </Setter>

        <Setter Property="YAxis">
            <Setter.Value>
                <s:NumericAxis  AxisAlignment="Right"
                                Visibility="Visible" 
                                TextFormatting="{Binding YAxisFormatting}" 
                                GrowBy="0.02, 0.02" 
                                AutoRange="Always"/>
            </Setter.Value>
        </Setter>

        <Setter Property="ChartModifier">
            <Setter.Value>
                <s:ModifierGroup>

                    <s:RubberBandXyZoomModifier IsAnimated = "False" IsXAxisOnly = "True" ExecuteOn = "MouseRightButton"/>
                    <s:ZoomPanModifier XyDirection="XYDirection" ClipModeX = "ClipAtExtents" ExecuteOn ="MouseLeftButton" />
                    <s:MouseWheelZoomModifier XyDirection = "XYDirection"/>
                    <s:ZoomExtentsModifier IsAnimated = "False" ExecuteOn = "MouseDoubleClick" />
                    <s:XAxisDragModifier  DragMode = "Scale"/>
                    <s:CursorModifier SourceMode="AllSeries"  UseInterpolation="True"/>
                    <s:LegendModifier ShowLegend="True" LegendPlacement ="Inside" GetLegendDataFor="AllSeries" Margin="10"/>

                     <!--<s:SeriesSelectionModifier ReceiveHandledEvents="True">
                            <s:SeriesSelectionModifier.SelectedSeriesStyle>
                                <Style TargetType="s:BaseRenderableSeries">
                                    <Setter Property="SeriesColor" Value="White"/>
                                    <Setter Property="PointMarkerTemplate">
                                        <Setter.Value>
                                            <ControlTemplate>
                                                <s:EllipsePointMarker Fill="#FF00DC" Stroke="White" Width="7" Height="7"/>
                                            </ControlTemplate>
                                        </Setter.Value>
                                    </Setter>
                                </Style>
                            </s:SeriesSelectionModifier.SelectedSeriesStyle>
                        </s:SeriesSelectionModifier>-->


                </s:ModifierGroup>
            </Setter.Value>
        </Setter>

    </Style>

</Window.Resources>

<Grid>

    <Grid.RowDefinitions>
        <RowDefinition Height="32" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>

    <StackPanel Grid.Row="0" Orientation="Horizontal" Background="Black">
        <TextBlock Text="Dataseries Type:" Margin="5,0" VerticalAlignment="Center" FontSize="12" Foreground="White"/>
        <ComboBox x:Name="ComboBox_ChooseSeriesType" MinWidth="140" Margin="5,3" VerticalContentAlignment="Center"/>
        <TextBlock Text="Theme:" Margin="5,0" VerticalAlignment="Center" FontSize="12" Foreground="White"/>
        <ComboBox x:Name="ComboBox_ChooseTheme" MinWidth="140" Margin="5,3" VerticalContentAlignment="Center"/>
    </StackPanel>


        <dxdo:LayoutGroup Grid.Row="1" x:Name="LayoutGroup" Orientation="Vertical">

            <!--<dxdo:LayoutPanel Name="Panel1">
                <s:SciChartSurface Name="Surface1" Style="{StaticResource SciChartSurfaceStyle}"></s:SciChartSurface>
            </dxdo:LayoutPanel>-->




    </dxdo:LayoutGroup>



    </Grid>

以及檢索style並應用style的代碼隱藏方法:

private void TestSomeStuff()
    {
        var style = this.TryFindResource("SciChartSurfaceStyle") as Style;
        var sciChartSurface1 = new SciChartSurface() {Style = style};
        var panel1 = new LayoutPanel(){Content=sciChartSurface1};

        var style2 = this.TryFindResource("SciChartSurfaceStyle") as Style;
        var sciChartSurface2 = new SciChartSurface() {Style = style2};
        var panel2 = new LayoutPanel() {Content = sciChartSurface2};
        LayoutGroup.Add(panel1);
        LayoutGroup.Add(panel2);
    }

編輯

panel1添加到LayoutGroup可以很好地工作,但是一旦我嘗試添加panel2 ,就會發生運行時錯誤。 另外,只要不將style注入SciChartSurface的新實例中, SciChartSurface可以正常工作。 一旦將樣式注入到兩個新曲面中,就會彈出錯誤消息。

不要在代碼后面直接設置樣式:

var style = this.TryFindResource("SciChartSurfaceStyle") as Style;
var sciChartSurface1 = new SciChartSurface() {Style = style};

但是使用SetValue方法:

var style = this.TryFindResource("SciChartSurfaceStyle") as Style;
var sciChartSurface1 = new SciChartSurface();
sciChartSurface1.SetValue(StyleProperty, style);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM