Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# UIElement.IsVisible==对于自定义控件为false,无法聚焦_C#_Wpf_Custom Controls - Fatal编程技术网

C# UIElement.IsVisible==对于自定义控件为false,无法聚焦

C# UIElement.IsVisible==对于自定义控件为false,无法聚焦,c#,wpf,custom-controls,C#,Wpf,Custom Controls,我有一个来自System.Windows.Controls.control的自定义wpf控件,它在大多数情况下运行得非常好 但是,有时对调用UIElement.Focus()的控件调用x.Focus()会返回false,并且不会对控件进行聚焦 经过一番挖掘,我发现了 var x = control as FrameworkElement; var focusable = x.Focusable; // -> true var enabled = x.IsEnabled; // ->

我有一个来自System.Windows.Controls.control的自定义wpf控件,它在大多数情况下运行得非常好

但是,有时对调用UIElement.Focus()的控件调用x.Focus()会返回false,并且不会对控件进行聚焦

经过一番挖掘,我发现了

var x = control as FrameworkElement;
var focusable = x.Focusable; // -> true
var enabled = x.IsEnabled;  // -> true
var visible = x.IsVisible; // -> FALSE <- !!! ARRGG

这也没有帮助。

您什么时候检查IsVisible以发现它为假?控件是否已完全初始化和加载?如果史努普认为这是真的,那么它一定是:)你什么时候会试图集中你的控制?如果您试图在它未完全初始化时对其进行聚焦,可能会有很多原因导致它无法工作

无论如何,请尝试通过方法选择控件,而不是使用


我也有同样的问题,不知道是什么引起的。我通过变通办法解决了这个问题

我将可见性设置为“在样式中折叠”,然后在加载的事件中将其设置为“可见”。我意识到这并非适用于所有用途,但如果其他人遇到此问题,您可以尝试此解决方法来解决此问题

 // Set to visible on load
 Loaded += delegate
 {
     Dispatcher.BeginInvoke(new Action(() => Visibility = Visibility.Visible));
 };


 <!-- By default set to Collapsed -->
 <Style TargetType="{x:Type MyCustomTypeThatIsMisbehaving}">
    <Setter Property="Visibility" Value="Collapsed"/>
 </Style>
//设置为加载时可见
已加载+=委托
{
Dispatcher.BeginInvoke(新操作(()=>Visibility=Visibility.Visible));
};

当控件变为可见时,IsVisibleChanged将触发,从那时起,它似乎工作正常

检查MSDN文档中所有的
覆盖
方法,并确保在强制要求时调用基类方法

我也遇到了同样的问题,在几乎发疯之后,我找到了罪魁祸首:我在VisualParentChanged上重写
,并且没有调用基类(
FrameworkElement
,在我的情况下),尽管MSDN明确指出:

始终调用基本实现以保留此行为, 否则,当声明为时,此元素的元素树行为 另一个元素的子元素可能不符合预期


添加对
base.OnVisualParentChanged
的调用后,
IsVisible
属性和
IsVisibleChanged
事件开始按预期运行。

已经尝试过,结果与UIElement.Focus()相同。是的,控件已完全初始化并加载。您能否提供一个小代码来重现您的问题?控件是更大应用程序框架的一部分,我将尝试隔离和重现您何时尝试执行该代码?您提到使用Snoop,它显示IsVisible是真的,但当应用程序空闲时会发生这种情况,即测量/排列/渲染完成。调用UpdateLayout不一定会有帮助,因为有时会忽略对的调用(例如,在测量/排列过程中)。也许你应该从你打电话的任何地方开始唤醒,然后集中注意力——或者挂接IsVisibleChanged,等待它被显示出来。控制从哪里来?您确定这与您在snoop中签入的元素实例相同吗?例如,如果此元素来自模板,则可能应用了新模板。尝试使用visualtreehelper或wpf tree visualizer在可视化树上漫游,并确保其确实位于可视化树中,并且此元素和每个可视化祖先的可见性未折叠。啊哈。。。我也有同样的问题。IsVisible=在视图中清晰可见的控件上为false。正在使用override OnRender呈现控件。它没有孩子
Keyboard.Focus(x);
 // Set to visible on load
 Loaded += delegate
 {
     Dispatcher.BeginInvoke(new Action(() => Visibility = Visibility.Visible));
 };


 <!-- By default set to Collapsed -->
 <Style TargetType="{x:Type MyCustomTypeThatIsMisbehaving}">
    <Setter Property="Visibility" Value="Collapsed"/>
 </Style>