2017-01-23 2 views
0

Visual Studio 2013에 C#/WPF 프로젝트가 있습니다.이 프로젝트에는 하나의 기본 창과 여러 개의 팝업 창이 있습니다. 대부분의 팝업 창에는 버튼을 비롯한 컨트롤 요소가 포함되어 있습니다.# 모든 WPF Windows 찾기

모든 창에서 모든 버튼을 찾을 필요가 있습니다. 또는 실제로 모든 버튼에 "IsEnabled"속성이 바인딩되어 있는지 찾아야합니다. 그래서 아래 코드에서 모든 버튼의 "IsChangePwdEnabled"를 찾고 싶습니다.

아래 코드는 하나의 창과 하나의 버튼의 예입니다. 솔루션에 30-40 개의 창과 몇 개의 버튼이 있습니다.

이 데이터를 추출 할 수있는 해결책이 있습니까? LogicalTreeHelper.GetChildren()을 사용하여 프로그램을 초기화했지만 그 함수를 사용하여 검색해야하는 개체의 Prent를 필요로하며 창 개체가 만들어 졌기 때문에이 작업을 수행 할 필요가 없습니다. 필요할 때. 팝업 창

예 (로그온) :

<window x:Class="ManagedHMI.CLogonDialog" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="clr-namespace:ManagedHMI" 
WindowStyle="ToolWindow" 
Topmost="True" 
Title="Logon" SizeToContent="WidthAndHeight" 
> 
<Grid Margin="5,5,5,5" > 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="Auto" /> 
    </Grid.ColumnDefinitions> 
... 
<Button x:Name="ChangePwd" Width="90" Click="ChangePwd_Click" IsEnabled="{Binding Path=IsChangePwdEnabled, UpdateSourceTrigger=PropertyChanged}"> 

코드 로그온 창 생성 : 내 프로그램에서

m_LogonDlg = new CLogonDialog(Logon, UnlockPc, ChangePassword, userDomain, m_language); 

을의 "의 IsEnabled"속성이 사용됩니다 어떤 버튼에 사용자가 사용할 수있는 권한이 있는지 확인하려면이 기능을 사용하여 모든 버튼에 대해 사용자 권한을 내보내고 싶습니다.

+0

, 바인딩의 IsEnabled에'UpdateSourceTrigger = PropertyChanged' 설정은 무의미하다. Binding은 OneWay이므로 소스를 업데이트하지 않습니다. – Clemens

답변

0

Application.Current.Windows 속성을 사용하여 창에 대한 참조를 가져온 다음 아래 질문에서 FindVisualChildren 메서드를 사용하여 특정 창에서 특정 유형의 모든 컨트롤을 찾을 수 있습니다. 이런 식으로 뭔가 : 참고로

var windows = Application.Current.Windows; 
foreach(var window in windows) 
{ 
    var buttons = FindVisualChildren<Buttons>(window); 
    if(buttons != null) 
    { 
     foreach(var button in buttons) 
     { 
      bool isEnabled = buttons.IsEnabled; 
      //... 
     } 
    } 
} 

Find all controls in WPF Window by type

+0

문제는'Application.Current.Windows'는 현재 (런타임) 활성 창 목록 만 가져오고 솔루션에있는 모든 창 목록이 필요하므로 현재 활성 (또는 생성되지 않은) 창은 있지만 프로그램의 실행에서 나중에 생성 될 수 있습니다. – mkvist

+0

아직 생성되지 않은 창에 대한 참조를 얻으려면 어떻게해야합니까? 창문이 만들어지기 전까지는 아무런 참고 자료가 없기 때문에 이것은 실제로 불가능합니다 ... – mm8