我有一个实例,其中详细信息模板中有两个主要的堆栈面板。
默认情况下,其中一个设置为折叠。但是,在右键单击并选择时,将触发该堆栈面板的可见性。当行详细信息已经扩展时,可能会发生这种情况。
但是,当展开行详细信息并选择右键单击以查看该堆栈面板时,我会以编程方式将其可见性更改为Visible,但它不会变为可见。
我是否需要进行二次调用以更新UI并强制执行可见性设置?
这是我的代码:
private void SetWFHistoryVisibility(bool show)
{
var elements = VisualTreeHelper.FindElementsInHostCoordinates(position, this);
var row = (from element in elements
where element is DataGridRow
select element).FirstOrDefault() as DataGridRow;
if (row != null)
{
DataGridDetailsPresenter presenter = VisualHelper.FindVisualChild<DataGridDetailsPresenter>(row);
if (presenter.Children.Count > 0)
{
var grid = (from el in presenter.Children
where el is Grid
select el).FirstOrDefault() as Grid;
if (grid != null)
{
StackPanel wfgc = grid.FindName("wfGridContainer") as StackPanel;
if (show)
wfc.Visibility = System.Windows.Visibility.Visible;
else
wfc.Visibility = System.Windows.Visibility.Collapsed;
}
}
}
}
答案 0 :(得分:0)
您可能需要根据面板/布局调用DataGridView.Refresh()或等效项。它也可以是父控件,也需要更新/刷新。
我知道在Silverlight DataGrid中确实有AutoRefresh,但它主要由DGV或DataGrid类中的EventTrigger控制。正如你发现它并不完美。
也许您可以触发以下某个事件,并允许Control计算出自己的视图更新。
https://msdn.microsoft.com/en-us/library/system.windows.controls.datagrid(v=vs.110).aspx
这一解决方案:
Dispatcher.BeginInvoke(() => {
//set the added control to be visible
});
由MSDN上的用户建议StackPanel刷新。
其他一些建议建议使用以下组合:
_.Invalidate()
_.UpdateLayout()
强制刷新。