C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[9]: WPF DataGridがWindow枠から外にはみ出す


(過去ログ 128 を表示中)

[トピック内 11 記事 (1 - 11 表示)]  << 0 >>

■76128 / inTopicNo.1)  WPF DataGridがWindow枠から外にはみ出す
  
□投稿者/ sora (1回)-(2015/06/02(Tue) 20:07:23)

分類:[.NET 全般] 

■開発環境:VisualStudio2010, .NetFramework4, C#

こんにちは。
WPFを使い、アプリケーション画面を作成しています。

Gridを使って、コンテンツを上部と下部に分けて、
それぞれがWindowの高さ全体に広がるようにしたいと考えています。

コンテンツの下部には、DataGridを配置しています。
想定としては、DataGridがフレームの下部いっぱいに広がり、
行数が多いときには、DataGridにスクロールバーが表示されるということを考えています。
また、画面のロード時に、BindしたデータがDataGridに追加されるように設定しています。


しかし、実際に、アプリケーションを起動すると、
DataGridの行数が多いときには、DataGridが、Window枠からはみ出して表示されてしまいます。
Windowを全画面表示にすると、その段階で、意図したレイアウトになります。


データ追加後に、DataGridをリフレッシュするなど、いろいろ試しましたが、
やはり枠からはみ出します。

ソースは下記の通りです。
お手数ですが、解決策やヒントをご指摘願えないでしょうか。

-----
■MainWindow.xaml
<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="640" Width="1000" 
        xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
        xmlns:local="clr-namespace:WpfApplication1">
    <Window.Resources>
        <local:LogTableData x:Key="logTableData" />
        <CollectionViewSource x:Key="logViewSource" Source="{Binding Path=LogList, Source={StaticResource logTableData}}" />
    </Window.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" MinHeight="400" />
            <RowDefinition Height="*" MinHeight="400"  />
        </Grid.RowDefinitions>
        <!-- 上部コンテンツ -->
        <Label Grid.Column="0" Grid.Row="0" />
        <!-- 下部コンテンツ(テーブル) -->
        <DataGrid Name="myTable" Grid.Column="0" Grid.Row="1" DataContext="{StaticResource logViewSource}" AutoGenerateColumns="False" ItemsSource="{Binding}" >
            <DataGrid.Columns>
                <DataGridTextColumn x:Name="clmLogDateTime" Binding="{Binding Path=LogDateTimeText}" Header="日時" Width="140" />
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

■MainWindow.xaml.cs

namespace WpfApplication1
{
    public class LogTableData
    {
        public ObservableCollection<LogInfo> LogList { get; set; }

        public LogTableData()
        {
            LogList = new ObservableCollection<LogInfo>();
        }
    }

    public class LogInfo
    {
        public DateTime LogDateTime { get; set; }
    }

    public partial class MainWindow : Window
    {
        private LogTableData _logTableData;

        public MainWindow()
        {
            InitializeComponent();

            Object res1 = this.Resources["logTableData"];
            _logTableData = (LogTableData)res1;
            if (_logTableData == null) _logTableData = new LogTableData();
            SetLogTableRow();
        }

        public void SetLogTableRow()
        {
            _logTableData.LogList.Clear();

            for (int i = 0; i < 50; i++)
            {
                LogInfo logInfo = new LogInfo();
                logInfo.LogDateTime = DateTime.Now;

                _logTableData.LogList.Add(logInfo);
            }
        }
    }
}



引用返信 編集キー/
■76130 / inTopicNo.2)  Re[1]: WPF DataGridがWindow枠から外にはみ出す
□投稿者/ Hongliang (313回)-(2015/06/02(Tue) 21:04:24)
WindowのHeightが640なのに、2つのRowDefinitionのMinHeightがどちらも400じゃあ割とどうしようも無いと思うのですが……。
というか両方にMinHeightを定義しちゃって、一体どういう表示を望んでいるのかさっぱり分かりません。
引用返信 編集キー/
■76133 / inTopicNo.3)  Re[2]: WPF DataGridがWindow枠から外にはみ出す
□投稿者/ sora (2回)-(2015/06/03(Wed) 10:16:46)
Hongliangさん、ご指摘ありがとうございます。

すみませんでした。
サンプルコードを作ったときに、間違いがありました。
MinHeightは、下記のように設定します。
両方にMinHeightを設定するのはよろしくないでしょうか?

その状態でも、やはりDataGridがはみ出します。
(下のRowDefinitionからMinHeightを除いても、表示は変わりません)

修正した内容は、下記の通りです。
そもそも、こういう書き方はしない、というご指摘でもかまいません。

よろしくお願いいたします。
-----
■MainWindow.xaml
<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="640" Width="1000" 
        xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
        xmlns:local="clr-namespace:WpfApplication1">
    <Window.Resources>
        <local:LogTableData x:Key="logTableData" />
        <CollectionViewSource x:Key="logViewSource" Source="{Binding Path=LogList, Source={StaticResource logTableData}}" />
    </Window.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" MinHeight="400" />
            <RowDefinition Height="*" MinHeight="50"  />
        </Grid.RowDefinitions>
        <!-- 上部コンテンツ -->
        <Label Grid.Column="0" Grid.Row="0" />
        <!-- 下部コンテンツ(テーブル) -->
        <DataGrid Name="myTable" Grid.Column="0" Grid.Row="1" DataContext="{StaticResource logViewSource}" AutoGenerateColumns="False" ItemsSource="{Binding}" >
            <DataGrid.Columns>
                <DataGridTextColumn x:Name="clmLogDateTime" Binding="{Binding Path=LogDateTimeText}" Header="日時" Width="140" />
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

■MainWindow.xaml.cs

namespace WpfApplication1
{
    public class LogTableData
    {
        public ObservableCollection<LogInfo> LogList { get; set; }

        public LogTableData()
        {
            LogList = new ObservableCollection<LogInfo>();
        }
    }

    public class LogInfo
    {
        public DateTime LogDateTime { get; set; }
    }

    public partial class MainWindow : Window
    {
        private LogTableData _logTableData;

        public MainWindow()
        {
            InitializeComponent();

            Object res1 = this.Resources["logTableData"];
            _logTableData = (LogTableData)res1;
            if (_logTableData == null) _logTableData = new LogTableData();
            SetLogTableRow();
        }

        public void SetLogTableRow()
        {
            _logTableData.LogList.Clear();

            for (int i = 0; i < 50; i++)
            {
                LogInfo logInfo = new LogInfo();
                logInfo.LogDateTime = DateTime.Now;

                _logTableData.LogList.Add(logInfo);
            }
        }
    }
}



引用返信 編集キー/
■76134 / inTopicNo.4)  Re[3]: WPF DataGridがWindow枠から外にはみ出す
□投稿者/ 魔界の仮面弁士 (365回)-(2015/06/03(Wed) 11:05:39)
No76133 (sora さん) に返信
> その状態でも、やはりDataGridがはみ出します。

質問内容からは、各行の高さをどのしたいのかが読み取れなかったのですが、
とりあえず、こんな感じでどうでしょう。

<Window … Height="640" Width="1000" MinHeight="500">
 <!-- …… -->
 <Grid>
  <Grid.RowDefinitions>
   <RowDefinition Height="400*" MaxHeight="600" />
   <RowDefinition Height="50*" MinHeight="100" />
   <!-- …… -->
 </Grid.RowDefinitions>
 <!-- …… -->
</Window>

MaxHeight はこちらで勝手に付与しました。邪魔なら外して下さい。
引用返信 編集キー/
■76137 / inTopicNo.5)  Re[4]: WPF DataGridがWindow枠から外にはみ出す
□投稿者/ sora (3回)-(2015/06/03(Wed) 14:34:36)
No76134 (魔界の仮面弁士 さん) に返信
魔界の仮面弁士さん

ご指摘ありがとうございます。
質問内容がわかりにくくてすみません。

Window全体の大きさは、ユーザーが任意に変えられるようにしたいと
考えています。
そして、上部と下部のコンテンツは、それぞれに最小の高さだけを指定し、
Window全体の大きさに合わせてそれぞれの高さが広がるようにしたいです。

また、サンプルコードでは書いてなかったのですが、
Splitterで、上下のRowの高さを任意に変えたいと考えています。

上部と下部のRowには、実際には、複数のコンポーネントが含まれています。
Windowサイズが小さくなっても、それぞれのコンポーネントが隠れないように、
最小の高さを指定したいと考えています。



ご指摘の内容を試しました。
上部のRowからMinHeightをなくすと、確かにDataGridがはみ出すことはなくなりました。ただ、前述の理由から、上部と下部のRow, 両方にMinHeightを指定したいと考えています…。


もう少し現実に沿う形にサンプルコードを書き換えました。
また、上部のRowの高さを「Auto」にすることで、
DataGridが枠外にはみ出なくなることがわかりました。

ただ、下部のRow「MinHeight」は、無視されてしまいます。
これだと想定しているレイアウトは崩れてしまうため、難しいです…。

-----
■MainWindow.xaml

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="640" Width="1000" MinHeight="500"
        xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
        xmlns:local="clr-namespace:WpfApplication1"  >
    <Window.Resources>
        <local:LogTableData x:Key="logTableData" />
        <CollectionViewSource x:Key="logViewSource" Source="{Binding Path=LogList, Source={StaticResource logTableData}}" />
    </Window.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" MinHeight="400" />
            <RowDefinition Height="3" />
            <RowDefinition Height="*" MinHeight="50" />
        </Grid.RowDefinitions>
        <!-- 上部コンテンツ -->
        <TextBlock Grid.Column="0" Grid.Row="0" Background="Green" VerticalAlignment="Stretch"/>
        <!-- Splitter -->
        <GridSplitter Grid.Column="0" Grid.Row="1" Height="6" HorizontalAlignment="Stretch"/>
        <!-- 下部コンテンツ(テーブル) -->
        <DataGrid Name="myTable" Grid.Column="0" Grid.Row="2" VerticalAlignment="Stretch" DataContext="{StaticResource logViewSource}" AutoGenerateColumns="False" ItemsSource="{Binding}" >
            <DataGrid.Columns>
                <DataGridTextColumn x:Name="clmLogDateTime" Binding="{Binding Path=LogDateTimeText}" Header="日時" Width="140" />
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

引用返信 編集キー/
■76138 / inTopicNo.6)  Re[5]: WPF DataGridがWindow枠から外にはみ出す
□投稿者/ sora (4回)-(2015/06/03(Wed) 14:50:46)
すみません、一箇所、記述にまちがいがありました。

■誤
上部と下部のRowには、実際には、複数のコンポーネントが含まれています。
Windowサイズが小さくなっても、それぞれのコンポーネントが隠れないように、
最小の高さを指定したいと考えています。

■正
上部と下部のRowには、実際には、複数のコンポーネントが含まれています。
ユーザーがSplitterをドラッグして高さを小さくしても、Row内部のコンポーネントが見えなくならないように、
最小の高さを指定したいと考えています。
引用返信 編集キー/
■76139 / inTopicNo.7)  Re[5]: WPF DataGridがWindow枠から外にはみ出す
□投稿者/ 魔界の仮面弁士 (367回)-(2015/06/03(Wed) 15:11:05)
No76137 (sora さん) に返信
> また、サンプルコードでは書いてなかったのですが、
> Splitterで、上下のRowの高さを任意に変えたいと考えています。

まぁ、質問内容からして固定サイズでは意味が無いですし、
resizable だろうというのは想像できましたが…。


> もう少し現実に沿う形にサンプルコードを書き換えました。

であれば、こうかな。


<Grid>
 <Grid.RowDefinitions>
  <RowDefinition Height="400*" MinHeight="400" />
  <RowDefinition Height="Auto" />
  <RowDefinition Height="50*" MinHeight="50" />
 </Grid.RowDefinitions>
 <GridSplitter Grid.Row="1" Height="3" HorizontalAlignment="Stretch" />
</Grid>
引用返信 編集キー/
■76140 / inTopicNo.8)  Re[6]: WPF DataGridがWindow枠から外にはみ出す
□投稿者/ sora (5回)-(2015/06/03(Wed) 15:36:00)
2015/06/03(Wed) 15:41:19 編集(投稿者)
2015/06/03(Wed) 15:41:09 編集(投稿者)

魔界の仮面弁士さん

ご指摘の方法で、無事に解決しました。
どうもありがとうございました!

Rowの高さの「*」に、数値を入力することで、Gridに高さの比率を教えてあげるということですね。
ただ単に複数のRowに「*」と入力すると、比率がないため、等分に分割されるため(おそらく・・・)、Splitterがドラッグできなくなってしまっていました。

教えていただけると納得できるのですが、なかなか答えにたどりつけませんでした。
大変助かりました。
解決済み
引用返信 編集キー/
■76145 / inTopicNo.9)  Re[7]: WPF DataGridがWindow枠から外にはみ出す
□投稿者/ 魔界の仮面弁士 (369回)-(2015/06/03(Wed) 16:35:01)
No76140 (sora さん) に返信
掲示板の利用ルールに
 「半角カナは使用しないでください。文字化けの原因になります。」
とあります。気付かずに使ってしまったのだとは思いますが、次回以降ご注意ください。


…という注意ついでに、少し雑記。


> ただ単に複数のRowに「*」と入力すると、比率がないため、
"*" は "1*" と同義だと思います、多分。
"3" は "3px" の意味かな。


> 教えていただけると納得できるのですが、
WPF は門外漢でして、私自身、GridSplitter という物を今回初めて使いました。(^^;
というか存在すら知りませんでした。(精進せねば…)



> なかなか答えにたどりつけませんでした。
一応、私の調べ方:

XAML 方面の知識は皆無なのですが、レイアウトの考え方は、
おそらく Web のスタイルシートと同種(いわゆるボックスレイアウト)、
そして高さ計算の優先順位は、WinForms の TableLayoutPanel に近いのでは無いか?
――と根拠無しに当たりをつけて、適当に試してみたのが No76134 のコードです。


なので、あの記述が正しい記述かどうかまでは知らないですし保証もできないのですが(汗)、
下記を読んでみた感じでは、大きく外れてはいないのかな、という印象でいます。
http://www.atmarkit.co.jp/ait/articles/0904/03/news104_3.html


この時点では、(ウィンドウ枠以外での)リサイズの手段は知らなかったので、
No76137 のサンプルが勉強になりました。

そして、そのコードに書かれていた『GridSplitter』で検索してみたところ、
https://msdn.microsoft.com/ja-jp/library/ff382751.aspx
https://msdn.microsoft.com/ja-jp/library/ms743457.aspx
が表示されたので、それを真似てみたら上手く行った、という程度です。

各行の高さを計算するための具体的な評価順などは、私もまだ理解していません。
解決済み
引用返信 編集キー/
■76147 / inTopicNo.10)  Re[8]: WPF DataGridがWindow枠から外にはみ出す
□投稿者/ sora (6回)-(2015/06/03(Wed) 17:53:00)
魔界の仮面弁士さん

解説ありがとうございます。
また、半角カナの件は、気づきませんでした。申し訳ありません…

GlidSplitterで検索するところが大事なんですね。
レイアウトがうまくいかなかったりすると、
根本的に問題あるのかとか、いろいろ疑ってしまい、迷宮に入ってしまいます。
なるべくシンプルに考えられるようになりたいです・・・。


引用返信 編集キー/
■76152 / inTopicNo.11)  Re[9]: WPF DataGridがWindow枠から外にはみ出す
□投稿者/ 魔界の仮面弁士 (373回)-(2015/06/03(Wed) 20:38:34)
No76147 (sora さん) に返信
> また、半角カナの件は、気づきませんでした。

今回の投稿にも含めてしまっているみたいですよ。
半角中黒は避けて、「…」「・・・」「...」などで代用してみてください。


(指摘ついでに、解決済みチェックを付け直しておきます)
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -