Pregunta

Tengo una aplicación donde cuando una persona tipos o selecciona un cuadro de lista que hay una parte de la pantalla que se actualiza automáticamente a una nueva vista.

El problema es desde WPF corre todo en un solo hilo de la visualización de la vista puede interfer escribir a máquina o navegar haciendo que la aplicación menos sensibles. Lo que me gustaría hacer es ejecutar la parte de la vista en un hilo diferente.

Lo primero que pensé fue utilizar una ventana que se ejecuta en un hilo diferente, pero más que ser una especie de truco no es el problema del foco de la ventana perder y se colocó detrás de la MainWindow cuando se hace clic en el MainWindow. Que podría hacerlo más alta pero también es necesario para colocar otras ventanas en frente de ella.

¿Cuál es la mejor manera de lograr esto, puedo colocar la vista en un marco y ejecutarlo en un hilo diferente?

No hay solución correcta

Otros consejos

Puede cargar / generar los datos en un subproceso de fondo y después actualizar la interfaz de usuario utilizando Dispatcher.BeginInvoke .

Yo propondría que utiliza la propiedad de visibilidad de esta pieza de la pantalla que desea hacer aparecer y utilizar un disparador para configurarlo de Invisible o colapsada a visible siempre que el usuario escribe o selecs. O bien, puede animar la propiedad Opacidad para producir un efecto de atenuación fresca ;-) Voy a añadir algo de código para ilustrar el punto. EDIT: una pérdida de tiempo backgroundtask, como operaciones de archivo, se puede lograr usando un 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;
        }
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top