2017-07-28 74 views
0

単純なWPF電卓アプリケーション用のグリッドを作成しようとしていますが、ボタンの描画に問題があります。WPFコントロールのサイズを常に親のサイズと同じにする

グリッド(grdPlusMinus)をコントロール全体のグリッド(grdControls)内のボタン(btnPlusMinus)内で使用しています。その上にシンプルなラベルが付いた楕円形のボタンを作成できます。楕円はボタンの可視部分を塗りつぶすはずです。

次のコードを使用すると、ウィンドウのサイズの変更方法に関係なく、楕円の下端と右端が切り取られます。楕円は常に比例しますが、完全には表示されません。 grdPlusMinusの幅と高さをAuto(コードではなく、VS UIを介して)にリセットすると、grdPlusMinusが1に設定され、その結果grdPlusMinusがすべて1ピクセルに縮小されます。

私はおそらく基本的なレベルで非常に愚かな何かをしているが、私はそれが何であるか考えることができない。 さまざまな種類のバインドと設定を試しました。 ActualWidthの代わりにWidthにバインドするなど - しかし私は何が間違っているのか分かりません。 マージンのためかもしれないと思ったが、マージンを一切取っても問題はそれほど変わらない。

私が間違っていなければならないことを誰かが指摘できますか? (私はKaxamlのXAMLのバリエーションを試して同じ問題を抱えていました)

もっと良い方法があれば - 全体的に - 私は何をしようとしていますが、私は何かを試す前に何が悪いのか知りたい。 (私の最終的な目的は、各ボタンの高さと幅をボタンの最小寸法に設定して、ボタンの中央に常に円として表示されるようにすることですが、この余分な情報が許さない限り、よりよい解決策)

<Window x:Class="Calc.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:Calc" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="651.5" Width="525" WindowStartupLocation="CenterScreen"> 
    <Grid x:Name="grdControls"> 
     <Grid.RowDefinitions> 
      <RowDefinition/> 
      <RowDefinition/> 
      <RowDefinition/> 
      <RowDefinition/> 
      <RowDefinition/> 
      <RowDefinition/> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition/> 
      <ColumnDefinition/> 
      <ColumnDefinition/> 
      <ColumnDefinition/> 
     </Grid.ColumnDefinitions> 
     <Button x:Name="btnPlusMinus" Grid.Row="5" Background="{x:Null}" BorderBrush="{x:Null}" Foreground="{x:Null}" Margin="4"> 
      <Grid x:Name="grdPlusMinus" Width="{Binding ActualWidth, ElementName=btnPlusMinus, Mode=OneWay}" Height="{Binding ActualHeight, ElementName=btnPlusMinus, Mode=OneWay}"> 
       <Ellipse x:Name="ellipse" Stroke="#FF39A8DC" Fill="#FFA0D2E2"/> 
       <Label x:Name="label" Content="XXX" HorizontalAlignment="Center" VerticalAlignment="Center" VerticalContentAlignment="Center" Foreground="#FF0A263A" HorizontalContentAlignment="Center"/> 
      </Grid> 
     </Button> 

    </Grid> 
</Window> 
+0

ここで何をしようとしていますか? –

+0

xamlの[button](http://www.c-sharpcorner.com/UploadFile/736ca4/style-button-in-wpf/)をカスタマイズする方法のチュートリアルです。 –

+0

'grdPlusMinus'の幅と高さの定義を削除します。あなたはそれらを必要としません。 – XAMlMAX

答えて

0

これは飛行機から飛び降りると私の傘がうまくいかない理由を尋ねるようなものです。あなたの問題に対する簡単な答えは、そのように使うつもりはありません。 XAMLには最高の測位システムの1つがあり、これを使用するのは簡単です(パフォーマンスはあまり良くないかもしれませんが、心配する必要はありません)。

<Grid> 
     <Grid.RowDefinitions> 
      <!-- For what you are doing the multiple rows are not needed you can use relative size they work by adding all the values in rows (1+5) and deviding them by it 
      so 5* is 5/6 of parant 
      and 1* is 1/6 of parent height 
      --> 
      <RowDefinition Height="5*"/> 
      <RowDefinition Height="1*"/> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <!-- works the same for columns --> 
      <ColumnDefinition Width="1*"/> 
      <ColumnDefinition Width="4*"/> 
     </Grid.ColumnDefinitions> 
     <Button Grid.Row="1"> 
      <Button.Style> 
       <!-- this is the template you button will use it's best to use global styles but you can inline it as well--> 
       <Style TargetType="Button"> 
        <Setter Property="Template" > 
         <Setter.Value> 
          <ControlTemplate TargetType="Button"> 
           <Grid> 
            <Ellipse Stroke="#FF39A8DC" Fill="#FFA0D2E2"/> 
            <!-- used to show what ever is in you inner button content it can be an image or textblock or anything --> 
            <ContentPresenter 
             Content="{TemplateBinding Content}" 
             HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
             VerticalAlignment="{TemplateBinding VerticalContentAlignment}" /> 

           </Grid> 
          </ControlTemplate> 
         </Setter.Value> 
        </Setter> 
       </Style> 
      </Button.Style> 
      <Label Content="XXX"></Label> 
     </Button> 
    </Grid> 

ここでは、gridの仕組みについて詳しく説明します。

+0

ありがとう@Filip Cordas。なぜ私はそれが欲しかったか(私が知る限り)外側のグリッドの定義を変更した理由は分かりませんが、ソリューションが機能し、楕円の周りに余白を追加して、お互いに触れないでください。ニース。アプリケーションスタイルを使用するように変換すると、ウィンドウのマークアップも非常に簡単になります。これは私が最初に考えていたほど簡単ではありませんでした。 ControlTemplatesやContentPresentersなどについてもっと知る必要があるようです。学習経験のすべての部分。とにかく、もう一度ありがとう。 – GarryP

+0

@GarryPまた、[this](http://wpftutorial.net/LayoutProperties.html)リンクをご覧ください。レイアウトシステムに関する詳細情報があります。あなたがそれについてのすべてのレッスンを見ているなら、ウェブサイト全体が本当に良いです。 –

+0

ありがとう@Filip Cordasもっとミスを犯す前に、私はこの全体の領域についてもっと知り合う必要があります。それはとても簡単に見えましたが、私が最初に知る必要があるルールは明らかです。それが最終的に「クリック」すると、適切なことをやり遂げるためのより良い立場になります。 – GarryP

0

それが起こっている理由を私は説明することはできません申し訳ありませんが、私はあなたの希望の結果がこれとボタンラインを交換することによって達成できることを見出し:

<Button x:Name="btnPlusMinus" Grid.Row="5" Background="{x:Null}" BorderBrush="{x:Null}" Foreground="{x:Null}" Padding="-5"> 

に注意してください。余白はパディング= " - 5"に置き換えられます

+0

あなたのソリューションは、この特定の例では動作しているように見えますが、それを修正するのではなく、問題をカバーする少しの "バンドエイド"のようです。マージンを無効にするたびに手動でパディングを設定するのは間違っているようです。ありがとう、しかし、私はそのような回避策を必要としない答えがあるかどうかを見るのを待つでしょう。 – GarryP

+0

私はあなたに同意します。うまくいけば、あなたは適切な説明/答えを得るか、それを理解するでしょう。良い週末を。 –

関連する問題