当另一个是Visibility.Collapsed时,一个图表占用空间

时间:2013-02-19 17:05:49

标签: c# wpf xaml user-interface

这是C#WPF和xaml。我有主窗口,我有两个共享此窗口的图表。它们是垂直排列的。它们都具有与主窗口相同的宽度。但是,我希望第一个图形填充整个窗口(除了窗口顶部的一些边距),当第二个图像折叠时,我希望它们共享高度(每个都有高度=(窗口高度)/ 2)当两者都可见时。

这是我在xaml中尝试过的,虽然不成功:

<Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="*" />
                    <RowDefinition Height="Auto" />
                </Grid.RowDefinitions>
                <d3:ChartPlotter  Grid.Row="0" Name ="timeDomainPlotter" >
                </d3:ChartPlotter>
                <d3:ChartPlotter  Grid.Row="1" Name ="freqDomainPlotter" >
                </d3:ChartPlotter>
            </Grid>

当第二个窗口的Visibility.Collapsed时,第一个窗口不会占用第二个窗口的空间。 我该怎么做?感谢。

更新: 转换器代码在弹出窗口中有两个图形:

 public class VisibilityToHeightConverter : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                GridLength height = new GridLength();

                var visiblity = (Visibility)value;
                switch (visiblity)
                {
                    case Visibility.Collapsed:
                        height = new GridLength(0, GridUnitType.Auto);
                        break;
                    case Visibility.Visible:
                        height = new GridLength(1, GridUnitType.Star);
                        break;
                    case Visibility.Hidden:
                        height = new GridLength(0, GridUnitType.Auto);
                        break;
                }

                return height;
            }

            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                throw new NotImplementedException();
            }
        }
        /// <summary>
        /// Interaction logic for SignalStatsDisplay.xaml
        /// </summary>
        public partial class SignalStatsDisplay : Window
        {
弹出窗口的

xaml:

<Window x:Class="FileWatcherCaller.View.SignalStatsDisplay"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d3="http://research.microsoft.com/DynamicDataDisplay/1.0"
   xmlns:local="clr-namespace:FileWatcherCaller.View"
    Title="Real Time Signal Display" Height="409" Width="1200">
    <Window.Resources>
        <local:VisibilityToHeightConverter x:Key="VisToHeightConv"/>
    </Window.Resources>
    <Grid> 
        <StackPanel Orientation="Vertical">
            <StackPanel Orientation="Horizontal">
                <CheckBox Height="16" HorizontalAlignment="Left" Name="pixVal" VerticalAlignment="Top" Width="120" Checked="checkBox1_Checked">Pixel Value</CheckBox>
                <CheckBox Height="16" HorizontalAlignment="Left" Name="roiMean" VerticalAlignment="Top" Width="120">ROI Mean</CheckBox>
                <CheckBox Height="16" HorizontalAlignment="Left" Name="roiStd" VerticalAlignment="Top" Width="120" Checked="roiStd_Checked">ROI Std</CheckBox>
            </StackPanel>
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="{Binding ElementName=timeDomainPlotter, Path=Visibility, Converter={StaticResource VisToHeightConv}}" Name="RowOne" />
                    <RowDefinition Height="{Binding ElementName=freqDomainPlotter, Path=Visibility, Converter={StaticResource VisToHeightConv}}" Name="RowTwo" />
                    <RowDefinition Height="Auto" />
                </Grid.RowDefinitions>
                <d3:ChartPlotter  Grid.Row="0" Name ="timeDomainPlotter" >
                </d3:ChartPlotter>
                <d3:ChartPlotter  Grid.Row="1" Name ="freqDomainPlotter" >
                </d3:ChartPlotter>
            </Grid>
        </StackPanel>
    </Grid>
</Window>

在主窗口中,如何初始化两个图的可见性:

public void StartWatch()
        {
            if (_fileWatcher != null)
            {
                _fileWatcher.Dispose();
                _fileWatcher = null;
            }
            if (InitWatcher())
            {
                this._fileWatcher.Start();
                this.ButtonStart.IsEnabled = false;
                this.ButtonStop.IsEnabled = true;
            }

             _signalDisplay = new SignalStatsDisplay();

            if (_signalDisplay.Visibility != Visibility.Visible)
            {
                _signalDisplay.Show();
                _signalDisplay.timeDomainPlotter.Visibility = Visibility.Visible;
                _signalDisplay.freqDomainPlotter.Visibility = Visibility.Collapsed;
            }


        }

对于Kevin的说法,我有弹出窗口的xaml:

<Window x:Class="FileWatcherCaller.View.SignalStatsDisplay"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d3="http://research.microsoft.com/DynamicDataDisplay/1.0"
    Title="Real Time Signal Display" Height="409" Width="1200">

    <Grid> 
        <StackPanel Orientation="Vertical">
            <StackPanel Orientation="Horizontal">
                <CheckBox Height="16" HorizontalAlignment="Left" Name="pixVal" VerticalAlignment="Top" Width="120" Checked="checkBox1_Checked">Pixel Value</CheckBox>
                <CheckBox Height="16" HorizontalAlignment="Left" Name="roiMean" VerticalAlignment="Top" Width="120">ROI Mean</CheckBox>
                <CheckBox Height="16" HorizontalAlignment="Left" Name="roiStd" VerticalAlignment="Top" Width="120" Checked="roiStd_Checked">ROI Std</CheckBox>
            </StackPanel>            
            <UniformGrid Columns="1">
                <d3:ChartPlotter Name ="timeDomainPlotter" >
                </d3:ChartPlotter>
                <d3:ChartPlotter Name ="freqDomainPlotter" >
                </d3:ChartPlotter>
            </UniformGrid>          
        </StackPanel>
    </Grid>
</Window>

但是,它并没有像预期的那样最大化顶级D3图。它仍然只占窗口的一半。我应该在后面的代码中做什么?

3 个答案:

答案 0 :(得分:2)

UniformGrid以您正在寻找的方式工作(只要您不希望用户调整这两个部分的大小)

<UniformGrid Columns="1">
<TextBox Visibility="Collapsed">Hello</TextBox>
<TextBox Visibility="Visible">Goodbye</TextBox>
</UniformGrid>

对于更灵活的东西,我认为你将不得不编写一些代码。

答案 1 :(得分:2)

<Window x:Class="FileWatcherCaller.View.SignalStatsDisplay"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d3="http://research.microsoft.com/DynamicDataDisplay/1.0"
    Title="Real Time Signal Display" Height="409" Width="1200">

    <Grid> 
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <StackPanel Orientation="Horizontal" Grid.Row="0">
            <CheckBox Height="16" HorizontalAlignment="Left" Name="pixVal" VerticalAlignment="Top" Width="120" Checked="checkBox1_Checked">Pixel Value</CheckBox>
            <CheckBox Height="16" HorizontalAlignment="Left" Name="roiMean" VerticalAlignment="Top" Width="120">ROI Mean</CheckBox>
            <CheckBox Height="16" HorizontalAlignment="Left" Name="roiStd" VerticalAlignment="Top" Width="120" Checked="roiStd_Checked">ROI Std</CheckBox>
        </StackPanel>            
        <UniformGrid Columns="1" Grid.Row="1">
            <d3:ChartPlotter Name ="timeDomainPlotter" >
            </d3:ChartPlotter>
            <d3:ChartPlotter Name ="freqDomainPlotter" >
            </d3:ChartPlotter>
        </UniformGrid>  
    </Grid>
</Window>

答案 2 :(得分:0)

以下是一个具有所需行为的示例应用:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication1"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <local:VisibilityToHeightConverter x:Key="VisToHeightConv"/>
    </Window.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="{Binding ElementName=rctTop, Path=Visibility, Converter={StaticResource VisToHeightConv}}" Name="RowOne" />
            <RowDefinition Height="{Binding ElementName=rctBottom, Path=Visibility, Converter={StaticResource VisToHeightConv}}" Name="RowTwo" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <Rectangle Fill="Black" Name="rctTop" Grid.Row="0"/>
        <Rectangle Fill="Red" Name="rctBottom" Grid.Row="1"/>
    </Grid>
</Window>

代码背后:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }
}
public class VisibilityToHeightConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        GridLength height = new GridLength();

        var visiblity = (Visibility)value;
        switch(visiblity)
        {
            case Visibility.Collapsed:
                height = new GridLength(0, GridUnitType.Auto);
                break;
            case Visibility.Visible:
                height = new GridLength(1, GridUnitType.Star);
                break;
            case Visibility.Hidden:
                height = new GridLength(0, GridUnitType.Auto);
                break;
        }

        return height;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

如果我们不熟悉此代码的任何部分(值转换器,绑定),请告诉我们,我们将提供解释。