События, возникающие при изменении содержимого элемента управления в Silverlight - PullRequest
2 голосов
/ 12 марта 2010

Если я изменю содержимое элемента управления с помощью XamlReader и добавлю UIElement в контейнер элемента управления, какие события должны запускаться? Есть моменты, когда SizeChanged сработает, LayoutUpdated изменится ... хотя бывают и другие случаи, когда ничего из этого не происходит, несмотря на изменение содержимого элемента управления.

В моем случае я создаю уменьшенное изображение того, что в данный момент отображается на странице. Пользователь может изменить содержимое страницы, и, таким образом, эскиз должен обновляться соответствующим образом. Тем не менее, подключение к LayoutUpdated, Loaded, SizeChanged не всегда надежно, когда содержимое изменилось.

Я бы просто назвал мой InvalidateThumbnail, использующий карту writeablebitmap, но он слишком быстр после установки содержимого, и в результате я получу пустой эскиз.

В данный момент мой хак (искажается) должен был подождать несколько миллисекунд, прежде чем пользовательский интерфейс завершит рендеринг фактического нового содержимого, и я смог надежно создать эскиз. Я бы предпочел просто вызывать событие каждый раз.

возможно? На какие события я должен смотреть? Я видел CompositeTarget.Rendering, но это не то, что я хочу.

Ответы [ 2 ]

1 голос
/ 12 марта 2010

Поскольку контент является свойством зависимости, вы можете использовать двустороннюю привязку данных и обрабатывать при изменении связанного свойства. Вот пример

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 голосов
/ 15 марта 2010

Хотя события происходят сами по себе, я могу использовать ContentControl и использовать привязку данных TwoWay, чтобы при обновлении xaml я мог вставить новый xaml, чтобы он работал.

В другой половине моего вопроса я обнаружил некоторые проблемы, связанные с тем, когда доступно визуальное дерево и что означает жизненный цикл элемента управления.

http://blogs.msdn.com/devdave/archive/2008/10/11/control-lifecycle.aspx [http://blogs.msdn.com/silverlight_sdk/archive/2008/10/24/loaded-event-timing-in-silverlight.aspx]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...