簡體   English   中英

控件不可見,即使可見性設置為可見

[英]Control not visible even visibility set to visible

我正在創建一個窗口,在其中單擊保存與數據庫通信並在數據庫中保存數據。 我想在單擊保存時顯示進度圖像,直到數據沒有保存到數據庫中為止。 我將圖像的可見性設置為true,但是進度圖像仍然不可見。

我已經完成了以下代碼...

在xml文件中。

    <TextBox x:Name="txt_Comment" VerticalScrollBarVisibility="Auto"  TextWrapping="Wrap" AcceptsReturn="True" MaxLength="5000"  Margin="2,2,2,0"></TextBox>
    <WrapPanel Grid.Row="1" HorizontalAlignment="Center" Margin="10,-15,0,0" VerticalAlignment="Center">
        <Button x:Name="btn_Ok" Margin="0,0,0,0" HorizontalAlignment="Center"  VerticalAlignment="Center" Click="btn_Save_Click"  Height="25" Width="55">Save</Button>
        <Button x:Name="btn_Cancel" Margin="10,0,0,0" HorizontalAlignment="Center" VerticalAlignment="Center"  Height="25" Width="55" Content="Cancel" Click="btn_Cancel_Click" >
        </Button>
    </WrapPanel>

    <Grid Grid.RowSpan="2" Background="Black" Opacity="0.25" Name="LoadingAdorner" Visibility="Hidden"/>
    <Border Width="400" Grid.RowSpan="2"  Opacity="1" Height="180" Visibility="Hidden" HorizontalAlignment="Center" VerticalAlignment="Center" CornerRadius="2" x:Name="loaderBorder">
        <Border.Background>
            <LinearGradientBrush  EndPoint="1,1" StartPoint="0,0" >
                <GradientStop Color="#EBF6FA" Offset="0.3"/>
                <GradientStop Color="#b7d9e5" Offset="1.0"/>
            </LinearGradientBrush>
        </Border.Background>
        <Border.Effect>
            <DropShadowEffect BlurRadius="5" Color="#FFB0B0B0" ShadowDepth="3" />
        </Border.Effect>
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="30"/>
                <RowDefinition/>
                <RowDefinition Height="95"/>
            </Grid.RowDefinitions>
            <Controls:LoadingAnimation Grid.Row="1" HorizontalAlignment="Center" FontWeight="Bold" LoadingText="Loading..."  VerticalAlignment="Center" />
            <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" FontWeight="Bold" FontFamily="Arial" Foreground="#647883" FontSize="14" Grid.Row="2" Text="Saving..."></TextBlock>
        </Grid>

    </Border>
</Grid>

在頁面后面的代碼中。

BackgroundWorker worker = new BackgroundWorker { WorkerSupportsCancellation = true };
worker.DoWork += delegate(object sender1, DoWorkEventArgs e1)
{
    CurrentDispatcher.Invoke(
        new Action(() =>
        {
            if (!string.IsNullOrEmpty(txt_Comment.Text))
            {
                LoadingAdorner.Visibility = Visibility.Visible;
                loaderBorder.Visibility = Visibility.Visible;
                using (Entities DB = new Entities(settings.LinqConnection))
                 {
                    if (txt_Comment.Text.Length > 1000)
                    {//In this case loading image is visible
                        MessageBox.Show("Comment is too large.", "Alert !", MessageBoxButton.OK, MessageBoxImage.Warning);
                        return;
                    }

                    var comment = DB.Table1.Create();//Here loading image is not visible.
                    comment.value = txt_Comment.Text;
                    comment.Date = DateTime.Now;
                    comment.ModifiedBy = settings.CurrentUID;
                    DB.Table1.Add(comment);

                    DB.SaveChanges();
                }
            }
        }),
    DispatcherPriority.Normal);
};

worker.RunWorkerCompleted += delegate(object s, RunWorkerCompletedEventArgs args)
{
    this.DialogResult = true;
    this.Close();
    LoadingAdorner.Visibility = Visibility.Collapsed;
    loaderBorder.Visibility = Visibility.Collapsed;
};

worker.RunWorkerAsync();

當消息框可見時,加載圖像不可見,但是當數據保存在數據庫中時,加載圖像不可見。

using塊移出CurrentDispatcher.Invoke()並放在此調用之后。

BackgroundWorker worker = new BackgroundWorker { WorkerSupportsCancellation = true };
        worker.DoWork += delegate(object sender1, DoWorkEventArgs e1)
        {
            CurrentDispatcher.Invoke(
                                 new Action(() =>
                                 {
                                     if (!string.IsNullOrEmpty(txt_Comment.Text))
                                     {
                                         LoadingAdorner.Visibility = Visibility.Visible;
                                         loaderBorder.Visibility = Visibility.Visible;                                         
                                     }
                                 }),
                                 DispatcherPriority.Normal);

                                 using (Entities DB = new Entities(settings.LinqConnection))
                                         {
                                             if (txt_Comment.Text.Length > 1000)
                                             {//In this case loading image is visible

                                                 MessageBox.Show("Comment is too large.", "Alert !", MessageBoxButton.OK, MessageBoxImage.Warning);
                                                 return;
                                             }

                                             var comment = DB.Table1.Create();//Here loading image is not visible.
                                             comment.value = txt_Comment.Text;
                                             comment.Date = DateTime.Now;
                                             comment.ModifiedBy = settings.CurrentUID;
                                             DB.Table1.Add(comment);

                                             DB.SaveChanges();
                                         }
        };

所以這段代碼對我有用:

private void Button_Click(object sender, RoutedEventArgs e)
{
    var worker = new BackgroundWorker { WorkerSupportsCancellation = true };
    worker.DoWork += delegate (object sender1, DoWorkEventArgs e1)
    {
        Dispatcher.Invoke(
                             new Action(() =>{testCtl.Visibility = Visibility.Visible;}),
                             System.Windows.Threading.DispatcherPriority.Normal);
        Task.Delay(3000).Wait();
    };
    worker.RunWorkerCompleted += delegate (object s, RunWorkerCompletedEventArgs args)
    {
        testCtl.Visibility = Visibility.Collapsed;
    };
    worker.RunWorkerAsync();
}

這是我在這種情況下的處理方式:

創建委托以更新您的可見性和相應的方法

將匿名函數包裝在與doWork事件兼容的函數中

當需要更新可見性時,創建一個新的委托並使用dispatcher.BeginInvoke()調用update方法。

    private delegate void UpdateVisibilityDelegate(Visibility visibility);

    private void UpdateVisiblity(Visibility visibility)
    {
        //LoadingAdorner.Visibility = visibility;
        //loaderBorder.Visibility = visibility;
    }

    private void Worker_DoWork(object sender, DoWorkEventArgs e)
    {
        // Your Action() code here
        // Change the visibility using this method
        Dispatcher.CurrentDispatcher.BeginInvoke(new UpdateVisibilityDelegate(this.UpdateVisiblity), Visibility.Visible);

    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM