Если ваши радиокнопки настроены, например, исходный значок для переключателя был скрыт с помощью css display:none
, чтобы вы могли создать свой собственный переключатель, тогда вы можете получить ошибку.
Чтобы исправить это, нужно заменить display:none
на opacity:0
Из http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/c95f1acb-5dee-4670-b779-b07b06afafff/
"System.Windows.Interop.ComponentDispatcher.IsThreadModal может сказать вам, если в настоящее время в вызывающем потоке работает модальный hwnd."
Можно ли проверить родителя окна, чтобы узнать, отключен ли он? Я не уверен, что это можно сделать с помощью API-интерфейсов WPF или нет, но если вы еще ничего не получили HWND из окна WPF, получите его родителя через Win32 P / Invoke (или что-то еще), а затем проверьте, отключен или нет.
Определенно не чистый метод, но похоже, что он может работать.
Хорошо, так как моя последняя идея проголосовала, я доказал это. это работает - и я тестировал его в новом приложении WPF, поэтому я знаю, что он работает:
В моем основном событии Window (Window1) Loaded я сделал:
Dim frm As New Window2
frm.ShowDialog()
In мой Window2 Я затенял метод ShowDialog ()
Private _IsModal As Boolean = False 'This will be changed in the IsModal method
Public Property IsModal() As Boolean
Get
Return _IsModal
End Get
Set(ByVal value As Boolean)
_IsModal = value
End Set
End Property
Public Shadows Sub ShowDialog()
IsModal = True
MyBase.ShowDialog()
End Sub
В моем загруженном событии я затем уволил окно сообщения, чтобы убедиться, что свойство IsModal изменено с False на True, и оно дает мне True, поэтому я знаю, что IsModal установлен. Затем MyBase.ShowDialog () заставляет базовый класс загружаться как модальный. Shadows позволяет переопределить поведение по умолчанию, даже если метод ShowDialog () не был объявлен как переопределяемый.
Хотя он не «самостоятельно определяет», он не требует, чтобы вы передавали любое логическое значение извне, и не требует, чтобы вы устанавливали IsModal извне, он устанавливает его внутри себя, он доступен снаружи, если вы так решили использовать его таким образом. Он устанавливает значение только в том случае, если оно загружено с помощью метода ShowDialog (), а не при использовании метода Show (). Я сомневаюсь, что вы найдете гораздо более простой способ сделать это.
Вот фрагмент конвертера, который полезен для скрытия элементов, когда окно вызывается методом ShowDialog:
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
Window window = value as Window;
if (window != null)
{
var showingAsDialogFieldInfo = typeof(System.Windows.Window).GetField("_showingAsDialog",
BindingFlags.NonPublic | BindingFlags.Instance);
if ((bool) showingAsDialogFieldInfo.GetValue(window) == false)
{
return Visibility.Visible;
}
}
return Visibility.Hidden;
}
Когда окно WPF является модальным диалогом, есть частное поле _showingAsDialog
. Вы можете получить это значение через отражение и включить его в метод расширения:
public static bool IsModal(this Window window)
{
return (bool)typeof(Window).GetField("_showingAsDialog", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(window);
}
Значение установлено в true, когда окно отображается как модальное (ShowDialog) и устанавливается на false после закрытия окна.
Используя UI Automation в Windows, я придумал что-то вроде этого:
void Window2_Loaded(object sender, RoutedEventArgs e)
{
var hwnd = new System.Windows.Interop.WindowInteropHelper(this).Handle;
var el = AutomationElement.FromHandle(hwnd);
Object oPattern = null;
if (el.TryGetCurrentPattern(WindowPattern.Pattern, out oPattern))
{
var pattern = oPattern as WindowPattern;
this.Title = pattern.Current.IsModal.ToString();
}
}
Но это кажется неработоспособным. Существует свойство IsModal http://msdn.microsoft.com/en-us/library/system.windows.automation.provider.iwindowprovider.ismodal.aspx должен быть правильный способ получить AutomationElement для окна и проверить, является ли свойство IsModal истинным с помощью Automation.
модальное окно прекратит обработку до тех пор, пока оно не будет закрыто.
В этом примере показано отображение немодального окна
dim f as myWindow
f.show
someOtherMethod()
В этом примере someOtherMethod запускается сразу после окна .
В этом примере показано отображение модального файла:
dim f as myWindow
f.showDialog
someOtherMethod()
В этом примере someOtherMethod () не будет работать до тех пор, пока метод ShowDialog не вернется (что означает, что модальный окно закрыто)
ИЗМЕНИТЬ из-за пояснения: переопределить ShowDialog и передать логическое значение.
dim f as MyWindow
f.ShowDialog(true)
, затем в окне
Public Function Shadows ShowDialog(myVar as boolean) As Boolean
if myVar then ShowButtons()
return mybase.ShowDialog()
End Function