none
1)呼び出したモーダルから親Windowを終了させる方法。2)自前画像をButtonに挿入する方法。 RRS feed

  • 質問

  • 以下のことを実現しようとしています。

    a) 親ウィンドウの「MENU」ボタンを押下すると、モーダルでメニューウィンドウを表示。

    b) メニューウィンドウは WindowStyle, WindowState は None で、背景やボタンなどは

    すべて自前の画像を貼り付ける。このとき、余計な外枠などは表示させたくない。

    c) メニューウィンドウ内の「アプリを終了」Button を押下すると、親ウィンドウ と メニューウィンドウが終了する、など、

    メニューウィンドウのボタン押下によってある数値を返し、親ウィンドウでその数値を使いたい。

    ------------------------------------------------------------------------------------------------------

     

    a) 実装済

    VC#プロジェクトに新しい Window を追加(名前:MenuWindow.xaml)し、親ウィンドウ内のButtonClickイベント内に

    MenuWindow mw = new MenuWindow();
    mw.WindowStyle = WindowStyle.None;
    mw.Window....
    ...
    mw.shoDialog();

    と記述し、モーダルで表示しています。

     

    b) 不完全な実装

    メニューウィンドウの背景に画像を挿入することは問題なくできました。

    一方、Buttonに画像を挿入しますと、うまくいきません。

     

    ■手段1(Button の Background にImageSourceを設定)

    この場合、ボタンをクリックすると、貼り付けた画像が消えてしまいます。

    フォーカスを別のアイテムに移すと、再び画像が表示されます。  NGです。

     

    ■手段2(Button の Content として Image を設定)

    画像サイズ(Width, Height)と Button のサイズを合わせても、

    実際の画面表示では画像よりもボタンが大きく、外枠があるように見えてしまいます。

    Padding = -3 くらいにすればボタンよりも Image が大きくなりますが、

    実際の画像サイズとは異なってしまうのでNGです。

     

    ■手段3(Button ではなく Image を直接張り付け、MouseUp で命令を記述)

    当然、画像は綺麗に張り付けられ、マウスイベントも取れます。

    が、c) を実現しようとした場合、親ウィンドウが DialogResult などで受け取るべき

    値を返せないと思います。 NG?

     

    c) 未実装

    ================================================

     

    長文となってしまい申し訳ありませんが、

    上記を実現できる方法はありますでしょうか。

    2010年6月3日 3:43

回答

すべての返信

  • こんばんは、おのでらです。

    b) については Button.Template を使ってみてください。

    http://msdn.microsoft.com/ja-jp/library/aa970268.aspx#WPF_Customization
    (コントロールテンプレートの箇所を参照)

    c)についてはメニューウインドウを閉じるときに「Window.DialogResult」を設定するのはどうでしょうか。

    • 回答としてマーク おのゆ 2010年6月3日 18:12
    2010年6月3日 10:16
  • こんばんは。返信が遅くなりました。

     

    長文にも関わらずご回答いただき、ありがとうございます。

    b), c) ともに提示していただいたもので解決できました。

    ありがとうございました。

     

    #

    FormsでのDialogResultでは、OKやらCancelやら色々とありましたが、

    Window.DialogResultは、true / false の2値しか取れないですね。

    今回は親ウィンドウの終了条件にしか使わないので2値でt十分ですが、

    もっと場合わけしたくなった時に悩みそうです。。。

    2010年6月3日 18:12
  • コントロールテンプレートを用いてボタンにImageを挿入することは出来ましたが、

    ロールオーバー時に画像を変更することが上手くいきません。

     

    調べる中で、以下のサイトに辿り着き、これらを参考にしてコーディングしましたが

    ビルド、実行、マウスオーバーすると、例外が発生して停止します。

     

    ■参考にしたサイト

    http://stackoverflow.com/questions/2320935/how-do-i-make-a-simple-image-based-button-with-visual-states-in-silverlight-3
    http://forums.silverlight.net/forums/p/129844/290224.aspx

     

    ■私が書いたコード(xaml)


    <Window x:Class="ControlTemplateTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
      <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
    
        <Button Name="button1" Width="319" Height="192" HorizontalAlignment="Center" VerticalAlignment="Center">
          <Button.Template>
            <ControlTemplate TargetType="{x:Type Button}">
              <Image Name="img_btn" Source="/ControlTemplateTest;component/Resources/btn_normal.png">
                <VisualStateManager.VisualStateGroups>
                  <VisualStateGroup x:Name="CommonStates">
                    <VisualState x:Name="Normal" />
                    <VisualState x:Name="MouseOver" >
                      <Storyboard Storyboard.TargetName="img_btn"
                            Storyboard.TargetProperty="Source">
                        <ObjectAnimationUsingKeyFrames>
                          <DiscreteObjectKeyFrame KeyTime="0" Value="/ControlTemplateTest;component/Resources/btn_mouseover.png" />
                        </ObjectAnimationUsingKeyFrames>
                      </Storyboard>
                    </VisualState>
                  </VisualStateGroup>
                </VisualStateManager.VisualStateGroups>
              </Image>
            </ControlTemplate>
          </Button.Template>
        </Button>
    
      </Grid>
    </Window>

    ■エラー内容

    System.Windows.Media.Animation.AnimationException
    のハンドルされていない例外が PresentationCore.dll で発生します。

    追加情報: 'System.Windows.Media.Animation.ObjectAnimationUsingKeyFrames' を使用して
    'System.Windows.Controls.Image' で 'Source' プロパティをアニメーション処理できません。

    と表示されます。

     

    ControlTemplate で Button に挿入した Image を

    マウスオーバー時に変更するにはどのように記述すれば良いのでしょうか。

     

    2010年6月8日 13:36
  •  

    自己レスです。以下のXamlで実現できました。

     

     

    <Window x:Class="ControlTemplateTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    
      <Window.Resources>
        <Style x:Key="button_style" TargetType="Button">
          <Setter Property="Template">
            <Setter.Value>
              <ControlTemplate TargetType="Button">
                <Image x:Name="img_btn" Source="Resources/btn_normal.png">
                  <VisualStateManager.VisualStateGroups>
                    <VisualStateGroup x:Name="CommonStates">
                      <VisualState x:Name="Normal" />
                      <VisualState x:Name="MouseOver" >
                        <Storyboard >
                          <ObjectAnimationUsingKeyFrames Storyboard.TargetName="img_btn"
                            Storyboard.TargetProperty="Source" BeginTime="00:00:00">
                            <DiscreteObjectKeyFrame KeyTime="00:00:00">
                              <DiscreteObjectKeyFrame.Value>
                                <BitmapImage UriSource="Resources/btn_mouseover.png" />
                              </DiscreteObjectKeyFrame.Value>
                            </DiscreteObjectKeyFrame>
                          </ObjectAnimationUsingKeyFrames>
                        </Storyboard>
                      </VisualState>
                      <VisualState x:Name="Pressed" >
                        <Storyboard>
                          <ObjectAnimationUsingKeyFrames Storyboard.TargetName="img_btn"
                                          Storyboard.TargetProperty="Source"
                                          BeginTime="00:00:00">
                            <DiscreteObjectKeyFrame KeyTime="00:00:00">
                              <DiscreteObjectKeyFrame.Value>
                                <BitmapImage UriSource="/ControlTemplateTest;component/Resources/btn_pressed.png" />
                              </DiscreteObjectKeyFrame.Value>
                            </DiscreteObjectKeyFrame>
                          </ObjectAnimationUsingKeyFrames>
                        </Storyboard>
                      </VisualState>
                    </VisualStateGroup>
                  </VisualStateManager.VisualStateGroups>
                </Image>
              </ControlTemplate>
            </Setter.Value>
          </Setter>
        </Style>
      </Window.Resources>
      
      <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
        <Button Style="{StaticResource button_style}" />
      </Grid>
    
    </Window>

     

    原因はよくわかりませんが、

    <DiscreteObjectKeyFrame Value=""Resources/btn_mouseover.png">

    で記述するとNGで、

    <DiscreteObjectKeyFrame.Value>
     <BitmapImage UriSource="Resources/btn_mouseover.png" />
    </DiscreteObjectKeyFrame.Value>

    で記述するとOKでした。

     

    2010年6月9日 1:52