2009-01-20 29 views
38

Tôi có một cửa sổ với điều khiển người dùng của mình và tôi muốn làm cho chiều rộng người dùng bằng chiều rộng cửa sổ. Làm thế nào để làm điều đó?Làm thế nào để kéo dài chiều rộng một điều khiển người dùng WPF đến cửa sổ của nó?

Việc kiểm soát người sử dụng là một menu ngang và chứa một mạng lưới với ba cột:

<ColumnDefinition Name="LeftSideMenu" Width="433"/> 
<ColumnDefinition Name="Middle" Width="*"/> 
<ColumnDefinition Name="RightSideMenu" Width="90"/> 

Đó là lý do tôi muốn chiều rộng cửa sổ, để căng các điều khiển người dùng đến 100% chiều rộng, với cột thứ hai quan hệ.

EDIT:

Tôi đang sử dụng một mạng lưới, có mã cho Window:

<Window x:Class="TCI.Indexer.UI.Operacao" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:tci="clr-namespace:TCI.Indexer.UI.Controles" 
    Title=" " MinHeight="550" MinWidth="675" Loaded="Load" ResizeMode="NoResize" WindowStyle="None" WindowStartupLocation="CenterScreen" WindowState="Maximized" Focusable="True" 
    x:Name="windowOperacao"> 
    <Canvas x:Name="canv"> 
     <Grid> 
      <tci:Status x:Name="ucStatus"/> <!-- the control which I want to stretch in width --> 
     </Grid> 
    </Canvas> 
</Window> 

Trả lời

38

Bạn cần đảm bảo rằng điều khiển người dùng của bạn đã không đặt chiều rộng của nó trong tệp xaml của usercontrol. Chỉ cần xóa chiều rộng = "..." từ nó và bạn tốt để đi!

EDIT: Đây là mã tôi thử nghiệm nó với:

SOUserAnswerTest.xaml:

<UserControl x:Class="WpfApplication1.SOAnswerTest" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Height="300"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Name="LeftSideMenu" Width="100"/> 
      <ColumnDefinition Name="Middle" Width="*"/> 
      <ColumnDefinition Name="RightSideMenu" Width="90"/> 
     </Grid.ColumnDefinitions> 
     <TextBlock Grid.Column="0">a</TextBlock> 
     <TextBlock Grid.Column="1">b</TextBlock> 
     <TextBlock Grid.Column="2">c</TextBlock> 
    </Grid> 
</UserControl> 

Window1.XAML:

<Window x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:WpfApplication1" 
    Title="Window1" Height="300" Width="415"> 
    <Grid> 

     <local:SOAnswerTest Grid.Column="0" Grid.Row="5" Grid.ColumnSpan="2"/> 
    </Grid> 
</Window> 
+0

Cám ơn sự quan tâm, Arjan. Nó hoạt động tốt ở đây quá, nhưng cửa sổ của tôi không có Width = "415" setted, bởi vì nó được thiết kế để được toàn màn hình. Khi tôi đặt chiều rộng, nó hoạt động tốt. –

1

chứa bạn đang thêm UserControl gì? Nói chung khi bạn thêm các điều khiển vào một Lưới, chúng sẽ kéo dài để lấp đầy khoảng trống sẵn có (trừ khi hàng/cột của chúng bị hạn chế theo chiều rộng nhất định).

2

Cài đặt HorizontalAlignment to Stretch và Width to Auto trên điều khiển người dùng có đạt được kết quả mong muốn không?

7

Sản phẩm Canvas quan trọng trong cửa sổ của bạn? Nếu không, hãy thử loại bỏ nó và giữ cho Grid là bảng điều khiển chính. Canvas không có kích thước trừ khi được chỉ định, trong khi Lưới thường chiếm tất cả không gian có sẵn. Bên trong Canvas, Grid sẽ không có dung lượng trống.

20

Canvas trong WPF không cung cấp hỗ trợ bố cục tự động nhiều. Tôi cố gắng tránh xa chúng vì lý do này (HorizontalAlignment và VerticalAlignment không hoạt động như mong đợi), nhưng tôi đã nhận được mã của bạn để làm việc với những sửa đổi nhỏ này (ràng buộc Chiều rộng và Chiều cao của điều khiển cho ActualWidth/ActualHeight của canvas).

<Window x:Class="TCI.Indexer.UI.Operacao" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:tci="clr-namespace:TCI.Indexer.UI.Controles" 
Title=" " MinHeight="550" MinWidth="675" Loaded="Load" 
ResizeMode="NoResize" WindowStyle="None" WindowStartupLocation="CenterScreen" 
WindowState="Maximized" Focusable="True" x:Name="windowOperacao"> 

<Canvas x:Name="canv"> 
    <Grid> 
     <tci:Status x:Name="ucStatus" Width="{Binding ElementName=canv 
                , Path=ActualWidth}" 
             Height="{Binding ElementName=canv 
                , Path=ActualHeight}"/> 
     <!-- the control which I want to stretch in width --> 
    </Grid> 
</Canvas> 

Canvas là vấn đề ở đây. Nếu bạn không thực sự sử dụng các tính năng mà canvas cung cấp về bố cục hoặc Z-Order "squashing" (nghĩ về lệnh flatten trong PhotoShop), tôi sẽ xem xét sử dụng điều khiển như Grid thay vì vậy bạn không kết thúc phải học những điều kỳ quặc của một điều khiển hoạt động khác với bạn đã mong đợi với WPF.

+0

Cảm ơn, ràng buộc với ActualWidth đã giúp tôi trong một dự án mà tôi đã có một UserControl tùy chỉnh trong một StackPanel. StackPanel sử dụng HorizontalAlignement = Stretch và lấy toàn bộ chiều rộng, nhưng usercontrol vẫn ở độ rộng 0. Gắn kết điều khiển người dùng với ngăn xếp cha mẹ của nó ActualWidth đã giải quyết nó cho tôi. –

1

Thay vì sử dụng Chiều rộng và Chiều cao trong điều khiển của người dùng, hãy sử dụng MinHeight và MinWidth. Sau đó, bạn có thể cấu hình UC tốt, và sẽ có thể kéo dài bên trong cửa sổ khác.

Vâng, như Im nhìn thấy trong WPF Microsoft đã thực hiện một suy nghĩ lại về cửa sổ tài sản và hành vi, nhưng cho đến nay, tôi đã không bỏ lỡ bất cứ điều gì từ các cửa sổ cũ hình thức, trong WPF các điều khiển có, nhưng trong một điểm mới xem.

0

Điều này phù hợp với tôi. không gán bất kỳ chiều rộng hoặc chiều cao nào cho UserControl và xác định định nghĩa hàng và cột trong cửa sổ chính.

<UserControl x:Class="MySampleApp.myUC" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" 
     > 
    <Grid> 

    </Grid> 
</UserControl> 


<Window xmlns:MySampleApp="clr-namespace:MySampleApp" x:Class="MySampleApp.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="auto" Width="auto" MinWidth="1000" > 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" />   
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*" />    
    </Grid.ColumnDefinitions> 
    <MySampleApp:myUC Grid.Column="0" Grid.Row="0" />  
</Grid> 

Các vấn đề liên quan