[英]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.