0

以前に作成した WinForm アプリケーションでモジュールを使用することに慣れているため、最初の WPF アプリケーションでモジュールを使用したいと考えています。だから私はこのボタンを持っていて、中にテキストブロックがあります。

MainWindow.xaml:

<Button x:Name="Connection_Button" Width="200" Height="30" Margin="5,5,5,5">
                        <TextBlock FontSize="14" MouseDown="TextBlock_MouseDown">CONNECT</TextBlock>
                    </Button>

以前の WinForms では、MainForm を追加することでボタンとそのテキスト プロパティを簡単に参照できました。コントロールの前ですが、以下のように、モジュールを介して WPF でこれを行うにはどうすればよいですか? モジュール コードの先頭でコントロールを宣言するにはどうすればよいでしょうか。また、TextBlock などのコントロール内の要素は?

私の古いWinFormのやり方でModule_Connection.vb:

Private Sub Connect()
        If MainForm.Connection_Button.Text = "Connect" Then
        ' Code
4

4 に答える 4

2

通常、これを WPF で行うことはありません。

アプリケーション ロジックを UI 要素の状態に基づいて作成することは、実際には良い考えではありません。

なんで?UI はデータではないため、代わりにデータ項目の状態に基づいてアプリケーション ロジックを作成する必要があります。

これこれを読むことをお勧めします

winforms を使用するのと同じ方法で WPF を使用しようとすることは、惨めな失敗と苦しみへのまっすぐな道です。

MVVM を採用し、DataBinding と、UI が常にアプリケーション ロジックおよびデータから分離されている必要があることを理解する必要があります。

編集:コード サンプルの追加 (C#)

ビューモデル:

public class MainViewModel
{
    public string ButtonContent {get;set;} //TODO: Add Property Change Notification

    public MainViewModel()
    {
        ButtonContent = "SomeButtonContent";
    }
}

意見:

<Button Width="200" Height="30" Margin="5,5,5,5">
    <TextBlock FontSize="14" Text="{Binding ButtonContent}"/>
</Button>

コードビハインド:

public class MainWindow: Window
{
    public MainWindow()
    {
        InitializeComponent();
        SomeModule.Instance = new MainViewModel();
        DataContext = SomeModule.Instance;
    }
}

モジュール (C# の静的クラス):

public static class SomeModule
{
    public static MainViewModel Instance {get;set;}

    public void DoSomething()
    {
        if (Instance.ButtonContent == "SomeButtonContent")
            //...etc
    }
}

これが、UI をデータから分離するという意味です。文字列を View ではなく ViewModel に配置し、それらの ViewModel プロパティの値を評価して、何をすべきかを決定します。

それでも、文字列の値に基づいてアプリケーション ロジックを作成することは、弱い解決策のように思えます。あなたは本当に何をする必要がありますか?これには列挙型を使用するなど、はるかに優れたアプローチがあります。

編集2:

ViewModel をバインドすることで、物事が「複雑」になることはありません。それは実際にそれらを大幅に簡素化します。

どのように?ControlTemplateこれは、単純なコントロールでこれを行っているためですが、その後、 内の UI 要素、またはさらに悪いことに同じことをしたいと思うようになり、DataTemplate実際の問題が発生するのはそのときです。

したがって、より複雑な UI シナリオを扱う前に、"WPF のやり方" に慣れる必要があります。

最適でないアプローチ:

public class MainWindow: Window
{
     public string ButtonContent
     {
         get
         {
             return this.txtButtonContent.Text;
         }
         set
         {
             this.txtButtonContent.Text = value;
         }
     }
}

<Button Width="200" Height="30" Margin="5,5,5,5">
    <TextBlock x:Name="txtButtonContent" FontSize="14" Text="Connect"/>
</Button>

ButtonクラスにはTextWPF のプロパティがないことを理解する必要があります。ほとんどの古いフレームワークとは対照的に、WPF には、Content Model文字通り何にでも、ほとんどまたはまったく制限なしで何でも含めることができるという特徴があります。ButtonにTextプロパティを配置すると、Button に Text のみを含めるという制限が導入されますが、これは WPF には当てはまりません。

したがって、ここで実際に行う必要があるのは、のTextプロパティを変更することですTextBlock(たまたまボタン内にありますが、実際にはビジュアル ツリーのどこにでもある可能性があります)。

そのため、データを保持するために ViewModel が実際に必要であるという事実に言及しました。たとえば、 内にある UI 要素にアクセスしDataTemplateて操作する (簡単な) 方法がないためです。UI は常に、UI ではなく、Model クラスまたは ViewModel クラスに格納されているアプリケーションのデータの状態を反映している必要があります。

于 2013-04-30T15:09:57.373 に答える
0

これで球場に入るはずです:

モジュール: Public Sub Connect(RyRef txtBox as TextBox) If txtBox.Text = "...

note パブリック vs. プライベート

コール: Call .Connect(MyTextBox1)

呼び出してオプションです

于 2013-04-30T14:44:22.643 に答える
0

別のアプローチは次のとおりです。

Dim mw as MainWindow = Application.Current.Windows.OfType(Of MainWindow).First

MainWindow があり、MainWindow が 1 つしかないとします。

于 2021-07-15T14:38:31.913 に答える