質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

659閲覧

WPFで別ウインドウが閉じられるまでStyleを保持したい

arw.tyx-out_mz

総合スコア27

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2019/07/18 11:08

編集2019/07/18 11:10

前提・実現したいこと

WPFでPrismを使用してGUIアプリを作成しています.
Canvas内に配置されたLineに対してカスタムイベントを用いてクリックするとサブウインドウが表示されるという設定をしています.
また,Lineは以下のようにIsMouseOverをトリガーにしてStyleの変更を行いますが,このIsMouseOverのときのStyleを,サブウインドウが閉じられるまで保持したいです.

Xaml

1 <Style x:Key="LineStyle" TargetType="{x:Type Line}"> 2 <Setter Property="Opacity" Value="0.0" /> 3 <Setter Property="Stroke" Value="Yellow" /> 4 <Setter Property="StrokeThickness" Value="2" /> 5 6 <Style.Triggers> 7 <Trigger Property="IsMouseOver" Value="True"> 8 <Setter Property="Opacity" Value="0.8" /> 9 <Setter Property="Stroke" Value="Red" /> 10 <Setter Property="StrokeThickness" Value="4" /> 11 <Setter Property="Cursor" Value="Hand"/> 12 </Trigger> 13 </Style.Triggers> 14 </Style>

該当のソースコード

MainWindow.xaml

Xaml

1<!-- 省略 --> 2 xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 3 xmlns:prism="http://prismlibrary.com/" 4<!-- 省略 --> 5 6 <i:Interaction.Triggers> 7 <prism:InteractionRequestTrigger SourceObject="{Binding LineRequest}"> 8 <prism:PopupWindowAction IsModal="True" WindowStartupLocation="CenterScreen"> 9 <prism:PopupWindowAction.WindowContent> 10 <controls:ParameterSettingControl/> 11 </prism:PopupWindowAction.WindowContent> 12 </prism:PopupWindowAction> 13 </prism:InteractionRequestTrigger> 14 </i:Interaction.Triggers> 15 16<!-- 省略 --> 17 <ItemsControl ItemsSource="{Binding PathCollection}"> 18 <ItemsControl.ItemsPanel> 19 <ItemsPanelTemplate> 20 <Canvas Height="512" Width="512"/> 21 </ItemsPanelTemplate> 22 </ItemsControl.ItemsPanel> 23 <ItemsControl.ItemTemplate> 24 <DataTemplate> 25 <Line Style="{StaticResource LineStyle}" 26 X1="{Binding P1.X}" 27 Y1="{Binding P1.Y}" 28 X2="{Binding P2.X}" 29 Y2="{Binding P2.Y}"> 30 <i:Interaction.Triggers> 31 <i:EventTrigger EventName="MouseDown"> 32 <prism:InvokeCommandAction Command="{Binding DataContext.LineCommand, 33 RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" 34 CommandParameter="{Binding}"/> 35 </i:EventTrigger> 36 </i:Interaction.Triggers> 37 </Line> 38 </DataTemplate> 39 </ItemsControl.ItemTemplate> 40 </ItemsControl>
MainWindowViewModel.cs

c#

1using Prism.Commands; 2using Prism.Mvvm; 3using Prism.Interactivity.InteractionRequest; 4using System.Collections.ObjectModel; 5 6<!-- 省略 --> 7 public ObservableCollection<Path> PathCollection { get; } = new ObservableCollection<Path>(); 8 public InteractionRequest<IParameterNotification> LineRequest { get; } = new InteractionRequest<IParameterNotification>(); 9 public DelegateCommand<Path> LineCommand { get; } = new DelegateCommand<Path>(RaisePathPopup); 10 11 public MainWindowViewModel() 12 { 13 PathCollection.Add(new Path(new Point(0, 0), new Point(111, 111)); 14 PathCollection.Add(new Path(new Point(111, 111), new Point(222, 222)); 15 PathCollection.Add(new Path(new Point(222, 222), new Point(333, 333)); 16 } 17 18 void RaisePathPopup(Path path) 19 { 20 LineRequest.Raise( 21 new ParameterNotification 22 { 23 Title = "PathParameter", 24 P1 = path.P1, 25 P2 = path.P2 26 }, 27 r => 28 { 29 if (r.Confirmed) 30 { 31 path.P1 = r.P1; 32 path.P2 = r.P2; 33 } 34 }); 35 }

できればコードビハインドは使用せずにXamlとViewModelだけで完結したいです.
どうかよろしくお願い致します.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

IsMouseOverで直接Styleを変更するのじゃなくて、i:EventTrigger云々でCommandを叩いて
Styleの状態をBindしたプロパティ(仮にApplyCatchingStyle)変えればいいかと
<Trigger Property="IsMouseOver" Value="True">

<DataTrigger Binding="{Binding ApplyCatchingStyle}" Value="True">

投稿2019/07/19 06:38

hihijiji

総合スコア4150

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問