Динамическое окно просмотра не растягивается - PullRequest
0 голосов
/ 26 октября 2011

В моем предыдущем примере окна ввода у меня есть переменная окна. Я создал несколько элементов управления (Textbox, Label, Buttons). Родителем этих элементов управления является canvas. Родителем холста является ViewBox (поскольку ViewBox может содержать только одного дочернего элемента), а родителем ViewBox является окно. Итак, иерархия похожа на Window->Viewbox->Canvas-> Controls. Все эти элементы управления создаются и воспитываются динамически.

        winInputDialog = new Window();
        lblPrompt = new Label();
        btnOK = new Button();
        btnCancel = new Button();
        txtInput = new TextBox();
        cvContainer = new Canvas();
        VB = new Viewbox();

        // 
        // lblPrompt
        // 
        lblPrompt.Background = new SolidColorBrush(SystemColors.ControlColor);
        lblPrompt.FontFamily = new FontFamily("Microsoft Sans Serif");
        lblPrompt.FontSize = 12;
        lblPrompt.Background = new SolidColorBrush(Colors.Transparent);
        lblPrompt.FontStyle = FontStyles.Normal;
        lblPrompt.Margin = new Thickness(8, 9, 0, 0);
        lblPrompt.Name = "lblPrompt";
        lblPrompt.Width = 302;
        lblPrompt.Height = 82;
        lblPrompt.TabIndex = 3;
        // 
        // btnOK
        // 
        btnOK.Margin = new Thickness(322, 8, 0, 0);
        btnOK.Name = "btnOK";
        btnOK.Width = 64;
        btnOK.Height = 24;
        btnOK.TabIndex = 1;
        btnOK.Content = "OK";
        btnOK.Click += new RoutedEventHandler(btnOK_Click);
        // 
        // btnCancel
        //          
        btnCancel.Margin = new Thickness(322, 40, 0, 0);
        btnCancel.Name = "btnCancel";
        btnCancel.Width = 64;
        btnCancel.Height = 24;
        btnCancel.TabIndex = 2;
        btnCancel.Content = "Cancel";
        btnCancel.Click += new RoutedEventHandler(btnCancel_Click);
        // 
        // txtInput
        // 
        txtInput.Margin = new Thickness(8, 70, 0, 0);
        txtInput.Name = "txtInput";
        txtInput.Width = 379;
        txtInput.Height = 25;
        txtInput.TabIndex = 0;
        //
        //Canvas
        //

        double width = System.Windows.SystemParameters.PrimaryScreenWidth / 3, height = System.Windows.SystemParameters.PrimaryScreenHeight / 4;

        cvContainer.Height = height;
        cvContainer.Width = width;

        cvContainer.Children.Add(txtInput);
        cvContainer.Children.Add(btnCancel);
        cvContainer.Children.Add(btnOK);
        cvContainer.Children.Add(lblPrompt);
        cvContainer.ClipToBounds = true;
        //
        //ViewBox
        //            
        VB.Stretch = Stretch.Fill;
        VB.Child = cvContainer;
        // 
        // InputBoxDialog
        //
        winInputDialog.Width = width;
        winInputDialog.Height = height;            
        winInputDialog.Content = VB;
        winInputDialog.Icon = new System.Windows.Media.Imaging.BitmapImage(new System.Uri(System.IO.Directory.GetCurrentDirectory() + @"\drop-box-icon.png"));
        winInputDialog.WindowStartupLocation = WindowStartupLocation.CenterScreen;
        //winInputDialog.WindowStyle = WindowStyle.SingleBorderWindow;
        winInputDialog.ResizeMode = ResizeMode.CanResizeWithGrip;
        winInputDialog.Name = "InputBoxDialog";

Я установил свойство ширины и высоты холста, равное окну. Но почему мой экран выглядит так:

screen

Почему существует пространство между элементами управления и границами окна, хотя они находятся в окне просмотра. Я даже попробовал Cliptobounds, но все так же.

Если я устанавливаю высоту и ширину Viewbox, он не растягивается и ведет себя в отличие от Viewbox.

Я хочу установить этот экран динамически. Как?

Пример проекта на http://122.160.24.172/download/customer_data/InputBox_New.rar.

1 Ответ

2 голосов
/ 26 октября 2011

Если вы хотите, чтобы ваше окно имело динамический макет, почему бы вам не использовать динамический контейнер в отличие от Canvas, который является статическим?

Вы можете использовать Grid вот так -

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="0.8*"/>
        <ColumnDefinition Width ="0.2*"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <TextBlock Text="Hello"/>
    <Button Grid.Column="1" Content="Ok"/>
    <Button Grid.Row="1" Grid.Column="1" Content="Cancel"/>
    <TextBox Grid.Row="2" Grid.ColumnSpan="2" Text="Hello"/>
</Grid>

Таким образом, ваше окно будет располагаться самостоятельно при изменении его размера. Вы все еще можете настроить размер кнопки и поля, если хотите.

Не используйте Canvas, если вам действительно не нужна поддержка для точного расположения пикселей.

Также: почему вы создаете макет своего окна программно, а не в XAML?

...