WPF Microsoft Ribbon Control не работает с FocusManager?

У меня проблема, когда я не могу заставить FocusManager распознавать, когда элемент управления ленты имеет фокус.

Логика проста. Я ставлю фокус на текстовое поле. Я пробовал как RibbonText, так и Textbox. Я вижу, что когда я щелкаю текстовое поле, срабатывает событие GotFocus, показывая, что теперь оно имеет фокус. Когда я перемещаю мышь на холсте, текстовое поле должно обновляться, но этого не происходит. FocusManager.GetFocusedElement возвращает значение null. Я попробовал это с помощью строки состояния и добавил текстовое поле. Используя строку состояния, GetFocusedElement возвращает текстовое поле.

Точно такой же код работал, когда я использовал сетку с двумя столбцами. В сетке был холст в левом столбце и панель стека с несколькими элементами управления-расширителями с текстовыми полями в них в правом столбце. Право было слишком занято слишком большим количеством элементов управления расширения, поэтому я переключился на управление лентой, поскольку несколько вкладок и другие функции сделали его оптимальным выбором.

Я пробовал все комбинации настроек "Focusable", но это не помогает.

<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";
        }
    }
}

person Flyer    schedule 09.09.2013    source источник
comment
попробуйте установить его focusable=true msdn.microsoft.com/ ru/библиотека/   -  person eran otzap    schedule 10.09.2013


Ответы (1)


Лента — это область фокуса, т. е. она устанавливает свой FocusManager.IsFocusScope в значение true, как и другие элементы (например, панель инструментов, меню и т. д.), которые хотят поддерживать свой собственный логически сфокусированный элемент. Поэтому вам нужно передать ленту в GetFocusedElement, если вы хотите найти логически сфокусированный элемент в пределах этой области фокуса. Если вам просто нужен текущий элемент, сфокусированный на клавиатуре, вы можете посмотреть Keyboard.FocusedElement. Подробнее о логическом фокусе можно прочитать здесь.

person AndrewS    schedule 10.09.2013