Domanda

Ho una domanda in cui quando una persona tipi o seleziona una casella di riepilogo c'è una parte dello schermo che aggiorna dinamicamente a una nuova visione.

Il problema è dato WPF gestisce tutto in un singolo thread la visualizzazione della vista può interferire con la battitura o la navigazione rendendo l'applicazione meno reattivo. Quello che mi piacerebbe fare è eseguire la parte vista in un thread diverso.

Il mio primo pensiero è stato quello di utilizzare una finestra in esecuzione su un thread diverso, ma più che essere qualcosa di un hack c'è il problema della finestra di perdere la concentrazione ed essere posizionato dietro la MainWindow quando il MainWindow viene cliccato. Ho potuto fare più in alto, ma ho anche bisogno di mettere altre finestre di fronte ad essa.

Allora, qual è il modo migliore per raggiungere questo obiettivo, posso posizionare la vista in una cornice ed eseguirlo in un thread diverso?

Nessuna soluzione corretta

Altri suggerimenti

È possibile caricare / generare i dati in un thread in background e quindi aggiornare l'interfaccia utente con Dispatcher.BeginInvoke .

Io proporrei di utilizzare la proprietà di visibilità di questo pezzo di schermo che si desidera far apparire e utilizzare un trigger per impostare da invisibile o ridotti a visibile ogni volta che l'utente digita o selecs. Oppure si può animare la proprietà Opacità per produrre un effetto di dissolvenza fresco ;-) Vorrei aggiungere po 'di codice per illustrare il punto. EDIT: un dispendio di tempo BackgroundTask, come le operazioni di file, può essere realizzato utilizzando 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;
        }
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top