سؤال

لديّ تطبيق حيث يقوم شخص ما بتكوين أو تحديد صندوق قائمة ، يوجد جزء من الشاشة يقوم بتحديث ديناميكي إلى عرض جديد.

تكمن المشكلة في أن WPF تقوم بتشغيل كل شيء في مؤشر ترابط واحد ، يمكن أن يتداخل عرض العرض مع الكتابة أو التنقل في جعل التطبيق أقل استجابة. ما أود القيام به هو تشغيل جزء العرض في موضوع مختلف.

كانت فكرتي الأولى هي استخدام نافذة تعمل على خيط مختلف ، ولكن أكثر من كونه شيء من الاختراق ، هناك مشكلة في فقدان النافذة التركيز ووضعها خلف الأساس عندما يتم النقر على الريف الرئيسي. يمكنني أن أجعلها أعلى ، لكنني بحاجة أيضًا إلى وضع نوافذ أخرى أمامها.

إذن ما هي أفضل طريقة لتحقيق ذلك ، هل يمكنني وضع العرض في إطار وتشغيله في موضوع مختلف؟

لا يوجد حل صحيح

نصائح أخرى

يمكنك تحميل / إنشاء البيانات في مؤشر ترابط خلفي ثم تحديث واجهة المستخدم باستخدام Dispatcher.BeginInvoke.

أود أن أقترح عليك استخدام خاصية الرؤية لهذه القطعة من الشاشة التي تريد أن تظهر وتستخدم تشغيلًا لتعيينها من غير مرئي أو انهارت إلى مرئية كلما كانت أنواع المستخدمين أو SELEC. أو يمكنك تحريك خاصية العتامة لإنتاج تأثير باهت بارد ؛-) سأضيف بعض التعليمات البرمجية لتوضيح النقطة. تحرير: يمكن تحقيق خلفية مستهلكة للوقت ، مثل عمليات الملفات ، باستخدام أ عمال الخلفية

<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;
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top