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
WPF Microsoft功能区控件不能与FocusManager一起使用?_Wpf_Focus_Controls_Ribbon_Focusmanager - Fatal编程技术网

WPF Microsoft功能区控件不能与FocusManager一起使用?

WPF Microsoft功能区控件不能与FocusManager一起使用?,wpf,focus,controls,ribbon,focusmanager,Wpf,Focus,Controls,Ribbon,Focusmanager,我有一个问题,无法让FocusManager识别功能区控件何时具有焦点 逻辑很简单。我把焦点放在一个文本框上。我试过RibbonText和Textbox。我看到当我点击文本框时,GotFocus事件触发,显示它现在有焦点。当我在画布上移动鼠标时,它应该会更新文本框,但这不会发生。FocusManager.GetFocusedElement返回null。我用状态栏尝试了一下,并添加了一个文本框。使用状态栏,GetFocusedElement返回文本框 当我使用具有两列的网格时,同样的代码也可以工作

我有一个问题,无法让FocusManager识别功能区控件何时具有焦点

逻辑很简单。我把焦点放在一个文本框上。我试过RibbonText和Textbox。我看到当我点击文本框时,GotFocus事件触发,显示它现在有焦点。当我在画布上移动鼠标时,它应该会更新文本框,但这不会发生。FocusManager.GetFocusedElement返回null。我用状态栏尝试了一下,并添加了一个文本框。使用状态栏,GetFocusedElement返回文本框

当我使用具有两列的网格时,同样的代码也可以工作。网格的左栏有一个画布,右栏有一个stackpanel,其中有几个带有文本框的扩展控件。右边的扩展器控件太多,所以我切换到Ribbon控件,因为多个选项卡和其他功能使它成为最佳选择

我已经尝试过设置“可聚焦”的所有组合,但它没有帮助

<ribbon:RibbonWindow x:Class="WpfRibbonApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:ribbon="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary"
        Title="MainWindow" x:Name="RibbonWindow" Width="640" Height="480">
    <Grid x:Name="LayoutRoot">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <ribbon:Ribbon x:Name="Ribbon">
            <ribbon:Ribbon.ApplicationMenu>
                <ribbon:RibbonApplicationMenu SmallImageSource="Images\SmallIcon.png">
                    <ribbon:RibbonApplicationMenuItem Header="Hello _Ribbon" x:Name="MenuItem1" ImageSource="Images\LargeIcon.png"/>
                </ribbon:RibbonApplicationMenu>
            </ribbon:Ribbon.ApplicationMenu>
            <ribbon:RibbonTab x:Name="HomeTab" 
                              Header="Home">
                <ribbon:RibbonGroup x:Name="Group1" 
                                    Header="Group1">
                        <TextBox Name="Try" Width="200" GotFocus="Try_GotFocus"></TextBox>                   
                </ribbon:RibbonGroup>               
            </ribbon:RibbonTab>
        </ribbon:Ribbon>
        <Canvas Grid.Row="1" Height="250" Margin="0,5,0,0" Name="canvas1" Background="AliceBlue" VerticalAlignment="Top" MouseMove="canvas1_MouseMove" />
    </Grid>
</ribbon:RibbonWindow>


using Microsoft.Windows.Controls.Ribbon;

namespace WpfRibbonApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : RibbonWindow
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void canvas1_MouseMove(object sender, MouseEventArgs e)
        {
                if (e.LeftButton == System.Windows.Input.MouseButtonState.Pressed)
                {
                    System.Windows.Point p = e.GetPosition(canvas1);
                    var fe = FocusManager.GetFocusedElement(this);   
                    if (fe != null)
                    {
                        var element = fe as FrameworkElement;

                        if (element.Name == "Try")
                        {
                            Try.Text = "Canvas has Focus";
                        }
                    }
                }
        }

        private void Try_GotFocus(object sender, RoutedEventArgs e)
        {
            Try.Text = "Got Focus";
        }
    }
}

使用Microsoft.Windows.Controls.Ribbon;
命名空间WpfRibbonApplication1
{
/// 
///MainWindow.xaml的交互逻辑
/// 
公共部分类主窗口:RibbonWindow
{
公共主窗口()
{
初始化组件();
}
私有void canvas1_MouseMove(对象发送方,MouseEventArgs e)
{
如果(e.LeftButton==System.Windows.Input.MouseButtonState.Pressed)
{
System.Windows.Point p=e.GetPosition(canvas1);
var fe=FocusManager.GetFocusedElement(此);
如果(fe!=null)
{
var元素=fe作为框架元素;
如果(element.Name==“Try”)
{
Try.Text=“画布有焦点”;
}
}
}
}
私有void Try_GotFocus(对象发送方,路由目标)
{
Try.Text=“获得焦点”;
}
}
}

功能区是一个焦点范围-即,它将其设置为true,就像其他要维护其自身逻辑焦点元素的元素(如工具栏、菜单等)一样。因此,如果要查找该焦点范围内的逻辑焦点元素,则需要将Ribbon传递给GetFocusedElement。如果您只需要当前以键盘为中心的元素,那么可以查看。您可以阅读有关逻辑焦点的更多信息。

尝试将其焦点设置为true