【问题标题】:x:Shared MarkupExtension in Silverlightx:Silverlight 中的共享标记扩展
【发布时间】:2012-02-20 19:13:19
【问题描述】:

silverlight 中缺少 x:Shared MarkupExtension 是否有解决方法?

我有以下 Xaml,它在每个目标系列上创建一个椭圆。我需要椭圆是唯一的,因为它们稍后会添加到画布中。通过使用此 Xaml,我得到 UIElement 已添加到另一个父级的错误(例如,单个 Ellipse 实例多次添加到 Canvas)。

在 WPF 中,我只需使用此样式的 x:Shared 属性即可使其工作。

    <!-- Set the style for the series -->
    <Style TargetType="SciChart:FastLineRenderableSeries" >
        <Setter Property="SeriesColor" Value="#FF93F2C1"/>
        <Setter Property="ResamplingMode" Value="Mid"/>
        <Setter Property="RolloverMarker">
            <Setter.Value>
                <Ellipse Width="9" Height="9" Fill="#7793F2C1" Stroke="#FFA3FFC9"/>
            </Setter.Value>
        </Setter>
    </Style>

我考虑的一种解决方法是创建一个名为 RolloverMarker 的控件并设置其控件模板。我将不胜感激任何直接或间接解决此问题的方法。

【问题讨论】:

标签: wpf silverlight xaml


【解决方案1】:

如果您要向面板动态添加对象,则每次都需要创建一个新对象,或者您需要在某种模板中定义您的控件并添加一个将使用该模板的新数据对象。您不能多次添加同一个项目。

例如,

// Does not work
var templateItem = new FastLineRenderableSeries();
myCanvas.Add(templateItem);
myCanvas.Add(templateItem);


// Works
myCanvas.Add(new FastLineRenderableSeries());
myCanvas.Add(new FastLineRenderableSeries());

或者

<ItemsControl ItemsSource="{Binding SomeCollection}"
              ItemTemplate="{StaticResource FastLineRenderableSeriesStyle}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Canvas />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>
// Add items. They'll get rendered with defined ItemStyle.
var templateItem = new FastLineRenderableSeries();
SomeCollection.Add(templateItem);
SomeCollection.Add(templateItem);

【讨论】:

  • 你好 Rachel,在这种情况下,FastLineRenderableSeries' 是在代码中创建的 (x3),但是它们在 Xaml 中的样式。失败的部分是在样式中设置的椭圆,这是在 FastLineRenderableSeries.RolloverMarker 的依赖属性上设置的。稍后这个 RolloverMarker 在代码中被添加到画布中。在 WPF 中,我通过在样式上使用 x:Shared 属性解决了这个问题。然而,在 Silverlight 中这是不可能的。我想为每个样式的 FastLineRenderableSeries 实例创建一个新的椭圆。你能想出什么办法吗?问候,
  • @Dr.AndrewBurnett-Thompson 我能想到的唯一方法是切换到使用Template 而不是硬编码对象。例如,如果您有一个 ContentControl 并将其 ContentTemplate 设置为 Ellipse,那么它应该可以工作,因为它将为每个控件创建一个新的 Ellipse,而不是尝试重新使用现有的。
  • 谢谢瑞秋,这就是我有预感的尝试 - 很高兴你已经确认了。我已经部分尝试过,它似乎有效。继续沿着这条路走下去,看看它会去哪里
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多