2010-03-12 94 views
2

假设我使用XamlReader更改控件的内容并将UIElement添加到控件的容器中,应该触发哪些事件?有些时候SizeChanged会触发,LayoutUpdated会改变..尽管在其他时候这些都不会发生,尽管改变了控件的内容。在Silverlight中更改控件内容时激发的事件

在我的情况下,我正在生成一个页面上当前视图的缩略图视图。用户可以改变页面的内容,因此缩略图应该相应地更新。尽管如此,布线更新,加载,SizeChanged并不总是可靠的,因为内容发生了变化。

我只会打电话给我使用writeablebitmap的InvalidateThumbnail,但设置内容后太快,因此我会得到一个空白缩略图。

此刻,我破解(卑躬屈膝)是等待几毫秒的UI做渲染实际的新的内容之前,我可以可靠地创建缩略图。但是,我宁愿每次都触发一个事件。

可能吗?我应该看什么事件?我见过CompositeTarget.Rendering,但那不是我想要的。

回答

1

由于内容是依赖项属性,因此可以使用双向数据绑定并在绑定属性更改时进行处理。下面是一个例子

XAML

<Grid x:Name="LayoutRoot"> 
    <StackPanel> 
     <ContentControl x:Name="ContentControl" Content="{Binding ContentProperty, Mode=TwoWay}"/> 
     <Button Click="Button_Click" Content="Change Content"/> 
    </StackPanel> 
</Grid> 

代码隐藏

public partial class MainPage : UserControl 
{ 
    public MainPage() 
    { 
     InitializeComponent(); 
     ContentControl.DataContext = new SomeObject(); 

    } 
    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     ContentControl.Content = XamlReader.Load("<TextBlock xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" Text=\"Hello\"/>"); 
    } 
} 

public class SomeObject 
{ 
    private object _contentProperty = null; 
    public object ContentProperty 
    { 
     get 
     { 
      return _contentProperty; 
     } 
     set 
     { 
      _contentProperty = value; 
      MessageBox.Show("Content Changed"); 
     } 
    } 
} 
+0

什么奇怪的是我还可以连接到网格的内容属性,以寻找变化和invaldiate我的缩略图,但它并没有每次开火尽管已经改变的内容。我使用这种方法,但由于某些奇怪的原因,它不能按预期工作。 http://amazedsaint.blogspot.com/2009/12/silverlight-listening-to-dependency.html – nyxtom 2010-03-12 18:01:39

+0

我将使用它作为网格控件的替代方法。 – nyxtom 2010-03-15 14:14:38

+0

它仍然不能解决缩略图的问题,但问题与Silverlight的潜在加载方法的工作方式有关。 – nyxtom 2010-03-15 14:15:16

相关问题