Сделайте что-нибудь после того, как пользовательский контроль загружен и отображается WPF

1

У меня есть UserControl и я загружаю его динамически в ContentControl при нажатии Button. У меня есть TextBlock в UserControl и я хочу показать некоторый текст динамически (который в основном является статусом, который мой другой метод вернет при обработке запроса) в TextBlock после загрузки UserControl. Я попытался настроить это в событии Loaded в UserControl но текст уже существует, когда UserControl полностью загружен и показан.

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

Благодарю Дипака

Теги:
wpf
user-controls

1 ответ

0

Если ваша загрузка логична, а не физическая, вы должны обрабатывать ее самостоятельно.

В частности, у вас должен быть способ сообщить UserControl при загрузке данных.

Вот полный пример с использованием MVVM (не идеально):

UserControl:

<UserControl x:Class="WpfApplication1.LoadDataView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WpfApplication1"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <UserControl.Resources>
        <BooleanToVisibilityConverter x:Key="boolToVizConverter"></BooleanToVisibilityConverter>
        <local:ReverseBooleanToVisibilityConverter x:Key="reverseBoolToVizConverter"></local:ReverseBooleanToVisibilityConverter>
    </UserControl.Resources>
    <Grid>
        <TextBlock Visibility="{Binding Model.IsLoadingData,Converter={StaticResource boolToVizConverter}}">...</TextBlock>
        <TextBlock Visibility="{Binding Model.IsLoadingData,Converter={StaticResource reverseBoolToVizConverter}}">Data loaded</TextBlock>
    </Grid>
</UserControl>

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

И когда данные загружаются, мы показываем "Data loaded".

Код позади:

using System.Windows;
using System.Windows.Controls;

namespace WpfApplication1
{
    public partial class LoadDataView : UserControl
    {
        public LoadDataViewModel Model
        {
            get { return (LoadDataViewModel)GetValue(ModelProperty); }
            set { SetValue(ModelProperty, value); }
        }

        public static readonly DependencyProperty ModelProperty = DependencyProperty.Register("Model", typeof(LoadDataViewModel), typeof(LoadDataView));

        public LoadDataView()
        {
            InitializeComponent();

            this.DataContext = this;
        }
    }
}

Модель просмотра:

using System.ComponentModel;

namespace WpfApplication1
{
    public class LoadDataViewModel : INotifyPropertyChanged
    {
        private bool isLoadingData = false;
        public bool IsLoadingData
        {
            get { return isLoadingData; }
            set
            {
                if (value != isLoadingData)
                {
                    isLoadingData = value;
                    PropertyChanged(this, new PropertyChangedEventArgs("IsLoadingData"));
                }
            }
        }

        public event PropertyChangedEventHandler PropertyChanged = delegate { };
    }
}

Вот основной вид:

<StackPanel>
    <ContentControl x:Name="content"></ContentControl>
    <Button Click="Button_Click">Display data</Button>
</StackPanel>

Когда мы нажимаем кнопку, мы показываем данные UserControl и запускаем загрузку:

private async void Button_Click(object sender, RoutedEventArgs e)
{
    LoadDataViewModel model = new LoadDataViewModel { IsLoadingData = true };

    content.Content = new LoadDataView { Model = model };

    await Task.Delay(3000);

    model.IsLoadingData = false;
}

async/await и Task материал только для имитации загрузки данных.

Наконец, вот обратный bool для конвертера видимости:

using System;
using System.Windows;
using System.Windows.Data;

namespace WpfApplication1
{
    public class ReverseBooleanToVisibilityConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return !(bool)value ? Visibility.Visible : Visibility.Collapsed;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню