WPF Frame в отдельной теме? - PullRequest
       22

WPF Frame в отдельной теме?

0 голосов
/ 27 января 2010

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

Проблема в том, что WPF запускает все в одном потоке, отображение представления может мешать вводу текста или навигации, делая приложение менее отзывчивым. То, что я хотел бы сделать, это запустить часть представления в другом потоке.

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

Итак, как лучше всего добиться этого, можно ли поместить представление в рамку и запустить его в другом потоке?

Ответы [ 2 ]

1 голос
/ 27 января 2010

Вы можете загрузить / сгенерировать данные в фоновом потоке и затем обновить пользовательский интерфейс, используя Dispatcher.BeginInvoke .

0 голосов
/ 27 января 2010

Я бы предложил вам использовать свойство Visibility этой части экрана, которую вы хотите сделать видимой, и использовать триггер, чтобы установить его из Invisible или Collapsed в Visible, когда пользователь вводит или выбирает. Или вы можете анимировать свойство Opacity, чтобы получить крутой эффект затухания ;-) Я добавлю немного кода, чтобы проиллюстрировать это. РЕДАКТИРОВАТЬ: отнимающая много времени фоновая задача, такая как операции с файлами, может быть выполнена с помощью BackgroundWorker

<Window x:Class="VisibleOnTypingSpike.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<StackPanel>
    <StackPanel Orientation="Horizontal">
        <Label Name="TypingSnooper"
               Visibility="{Binding TypingSnooperVisibility}">
            You are typing!</Label>
        <Label>
            <Label.Style>
                <Style>
                    <Setter Property="Label.Opacity" Value="0"/>
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding HasListBoxNewSelection}" Value="True">
                            <DataTrigger.EnterActions>
                                <BeginStoryboard >
                                    <Storyboard>
                                        <DoubleAnimation From="0" To="1"
                                                         Duration="0:0:1"
                                                         Storyboard.TargetProperty="Opacity"/>
                                    </Storyboard>
                                </BeginStoryboard>
                            </DataTrigger.EnterActions>
                            <DataTrigger.ExitActions>
                                <BeginStoryboard >
                                    <Storyboard>
                                        <DoubleAnimation From="1" To="0"
                                                         Duration="0:0:1"
                                                         Storyboard.TargetProperty="Opacity"/>
                                    </Storyboard>
                                </BeginStoryboard>
                            </DataTrigger.ExitActions>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Label.Style>
            You selected!
        </Label>
    </StackPanel>
    <TextBox TextChanged="TextBox_TextChanged"></TextBox>
    <ListBox Name="SimpleListBox"
             SelectionChanged="SimpleListBox_SelectionChanged">
        <ListBoxItem>1</ListBoxItem>
        <ListBoxItem>2</ListBoxItem>
    </ListBox>
</StackPanel>

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

namespace VisibleOnTypingSpike
{
    public partial class Window1 : Window
    {
        public Visibility TypingSnooperVisibility
        {
            get { return (Visibility)GetValue(TypingSnooperVisibilityProperty); }
            set { SetValue(TypingSnooperVisibilityProperty, value); }
        }

        public static readonly DependencyProperty TypingSnooperVisibilityProperty =
            DependencyProperty.Register("TypingSnooperVisibility",
                                        typeof(Visibility),
                                        typeof(Window1),
                                        new UIPropertyMetadata(System.Windows.Visibility.Collapsed));

        public bool HasListBoxNewSelection
        {
            get { return (bool)GetValue(HasListBoxNewSelectionProperty); }
            set { SetValue(HasListBoxNewSelectionProperty, value); }
        }

        public static readonly DependencyProperty HasListBoxNewSelectionProperty =
            DependencyProperty.Register("HasListBoxNewSelection",
                                        typeof(bool),
                                        typeof(Window1),
                                        new UIPropertyMetadata(false));

        public Window1()
        {
            InitializeComponent();
            DataContext = this;
        }

        private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
        {
            var textbox = (TextBox) sender;
            if (textbox.Text.Length > 0) TypingSnooperVisibility = Visibility.Visible;
            else TypingSnooperVisibility = Visibility.Hidden;
        }

        private void SimpleListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            HasListBoxNewSelection = true;
            HasListBoxNewSelection = false;
        }
    }
}
...