Caliburn.Micro ShowPopup — установка фокуса

Я пытаюсь использовать Caliburn.Micro (для моего первого проекта WPF MVVM), и я изо всех сил пытаюсь заставить метод WindowManager.ShowPopup установить фокус на всплывающем экране. Это возможно? Образец HelloWindowManager от Caliburn тоже этого не делает, и документация довольно легкая.


person fussmonkey    schedule 02.05.2013    source источник
comment
Вы хотите, чтобы ваше всплывающее окно было модальным?   -  person Daniel Hilgarth    schedule 02.05.2013
comment
Интересно, сработает ли вызов Focus для одного из элементов управления всплывающими окнами (я не думаю, что есть способ сосредоточиться на самом всплывающем окне). Если это так, вы можете просто создать некоторую функциональность, чтобы найти элемент по имени в представлении (используя IViewAware.GetView()) и сфокусировать его после создания виртуальной машины.   -  person Charleh    schedule 02.05.2013
comment
В конце концов я получил эту работу с комбинацией ShowWindow (не ShowPopup), а также с использованием EventAggregator для публикации события в ViewModel вызываемого окна... там я установил свойство и использовал DataTrigger в представлении, чтобы установить фокус через FocusManager . Это может быть взлом, но, похоже, он работает.   -  person fussmonkey    schedule 02.05.2013
comment
Для меня это не похоже на взлом - нет причин, по которым представление не может зависеть от службы, такой как агрегатор событий, и вы поддерживаете хорошее разделение между моделью представления и проблемами представления - вы должны опубликовать как ответ, и я бы проголосовать за это :)   -  person Charleh    schedule 03.05.2013
comment
фокус всплывающего окна wpf - это боль ... даже без самого caliburn я не могу заставить его работать ... после вызова popup.IsOpen = true я пробовал несколько подходов, чтобы сфокусировать первый элемент управления во всплывающем окне, не повезло   -  person JobaDiniz    schedule 21.06.2017


Ответы (1)


В конце концов, мне не удалось заставить метод ShowPopup работать так, как я хотел.

Вместо этого я использовал ShowWindow, а затем использовал EventAggregator для публикации события, когда я показывал окно. В ViewModel для вызванного представления я подписался на это событие и установил для свойства ViewModel значение true (в данном примере это KeywordEntryActive).

Затем я использую стиль в сетке, который использует DataTrigger, привязанный к этому свойству, для вызова метода FocusManager.FocusedElement в представлении.

<Grid.Style>
    <Style>
        <Style.Triggers>
            <DataTrigger Binding="{Binding KeywordEntryActive}" Value="True">
                <Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=Command}" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Grid.Style>

Это казалось менее простым, чем я надеялся, но я смог добиться того, что искал, не жертвуя разделением ViewModel и View, поэтому на данный момент я доволен этим. Caliburn.Micro пришлось немного поучиться, но до сих пор мне удавалось преодолевать препятствия, с которыми я сталкивался, и я продолжаю идти по этому пути.

person fussmonkey    schedule 03.05.2013