2011-05-10 21 views
25

Bu soruna çok fazla çözüm okudum. bunların her biri benim problemimi çözmek için başarısız. Kontrole hangi konteynırı koyduğum önemli değil ya da kontrol/konteynırda hangi özellikleri belirlediğime bakmayın. İçinde kontrole sahip bir kaydırma görüntüleyicim var. Kullanıcı çalışma zamanında yeniden boyutlandırdığında, pencereyle yeniden boyutlandırılmasını istiyorum. Tek ihtiyacım olan çapa = üst, alt, sol, sağ. Bunun WPF'de neden bu kadar zor olduğunu anlamıyorum ve neden Konteyner nesnelerinin ve her türlü mülkün görevlendirilmesinin, Formlar'da tek bir mülkün yapılabildiğini başarmak için neden yer alması gerektiğini anlamıyorum. Ancak, bu soruna her çözüm hala benim çalışma zamanımda pencere yeniden boyutlandırılırken denetimimin tam olarak tasarım süresi boyutunda kalmasıyla sonuçlanır. Wpf'de dinamik kontrol boyutlandırmasında bir kavrama elde etmenin kolay yolu nedir?WpF'de kontrollerin yeniden boyutlandırılması nasıl yapılır, çapa/yuva özelliklerinin eşdeğeri

+2

beind XAML kodunda

<MyParentControl x:name="parentControl" SizeChanged="parentControl_SizeChanged"> <ChildControl x:name=childControl" /> </MyParentControl>

Bize şu anda var XAML kodunu gösterir misiniz? – svick

+0

Sen genişlik/yükseklik = "*" denemek ve/veya kullanabilirsiniz StackPanel – deathrace

cevap

5

kontrol germek gerekiyor, hepsi buna olmalıdır var:

<MyControl HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/> 

Stretch gelen yanları hem achors ayarı değiştirir.

Paneller hakkındaki yardım için bkz. this overview. Ayrıca documentation of the layout system'a bakın.

Çoğu denetimleri otomatik germek, bunu da germek Kaxaml bu örnek denemelisiniz DataGrid varsa, onun büyüklüğünü gösteren bir DataGrid ve bir TextBlock içerir: Camı boyutu ise

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition /> 
      <RowDefinition Height="Auto"/> 
     </Grid.RowDefinitions> 
     <DataGrid Name="grid"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Binding="{Binding Name}" Header="Name"/> 
       <DataGridTextColumn Binding="{Binding Tag}" Header="Occupation"/> 
      </DataGrid.Columns> 
      <FrameworkElement Name="Skeet" Tag="Programmer"/> 
      <FrameworkElement Name="Gravell" Tag="Programmer"/> 
      <FrameworkElement Name="Steve" Tag="Coffee Getter"/> 
     </DataGrid> 
     <TextBlock Grid.Row="1"> 
      <TextBlock.Text> 
       <MultiBinding StringFormat="{}{0}, {1}"> 
        <Binding ElementName="grid" Path="ActualWidth"/> 
        <Binding ElementName="grid" Path="ActualHeight"/> 
       </MultiBinding> 
      </TextBlock.Text> 
     </TextBlock> 
    </Grid> 
</Window> 

DataGrid'in ScrollBar'ları görünmelidir.

+0

Ben hizalama ayarlarının her birleşimini denedim. her seferinde kontrol, tasarım zaman boyutlarında kesinlikle kalır. Yeniden boyutlandırmayı engelleyen başka bir şey olmalı, sadece ne olduğunu göremiyorum. Kontrol içindedir – Mike

+0

paneli aksi takdirde germek için mümkün olmayacaktır, sınırları sunduğu bir ScrollViewer Bunun tüm amacı mümkün her boyuttaki denetimleri görüntülemek için yapım olduğundan, normalde kendi içeriklerini kısıtlamak olmadığını yapmaz. Düzenleme: Aslında bazı durumlarda ScrollViewer ile çalışır, bazı durumlarda, kontrolüne bağlıdır. Yine de kullandığınız kontrol nedir? –

+0

Bir veri ızgarası. Bunu yapmaya çalışıyorum ki, scrollviewer pencerenin boyutuna (veya pencerenin kullanılabilir boyutuna göre yeniden boyutlandırılacak, bunun üzerinde başka kontroller de olacak, fakat bu daha büyük olması gereken). datagrid hala çok büyük. scrollviewer'ın sınırların dışına çıkmak için bir araç sağlamasını istiyorum. – Mike

4

Yeniden boyutlandırılmayan denetimin özel denetiminiz olduğunu varsayalım.

  • DockPanel'i bir kapsayıcı olarak kullanın.
  • Açık Genişlik ve Yükseklik özelliklerini denetiminizden kaldırın. Eğer VS2008 çalışıyorsanız, tasarımcı bakıldığında minimum boyuta çökerdi kontrol çünkü

, o zaman bu, rahatsızlık neden olur.

İfadeler Karıştırma ve VS2010'dan başlayarak her ikisi de tasarımcı ad alanına saygı duyar, böylece tasarım süresini yalnızca kontrol boyutunu belirtebilirsiniz.

<UserControl ... 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    mc:Ignorable="d" 
    d:DesignWidth="WWW" d:DesignHeight="HHH"> 
    .... 
</UserControl> 

d:: DesignWidth ve d: o sizin kontrolünüz aşağıdakileri ekleyin İçin

tasarım zamanı genişliğini ve yüksekliğini belirtmek DesignHeight.

+0

Bir dock paneline koymaya çalıştım. Kontrol panelinin rıhtım panelini doldurmak için genişleyeceği gözüküyor, ancak rıhtımpanelin kendisi pencere ne kadar büyük olursa olsun aynı büyüklükte kalıyor. – Mike

+0

Bu kazayı kazayla düşürdüm. O zaman bunu yaptığımı bile anlamadım. Geri almayı isterdim, ancak cevap düzenlenmedikçe oyumu değiştirmeme izin vermez. – TomDestry

1

Bu soru eskidir, ama burada bulunduğumdan beri çözümümümü atacağımı düşündüm. Aşağıdaki kod, iki sekmeli bir sekme kontrolü içindir ve her sekme sekmeyi doldurmak için bir kontrol içerir. Açık olarak ayarlanmış genişliği ve yüksekliği kaldırdım ve yeniden boyutlandırmak istediğim tüm denetimlerde yatay ve dikey hizalamaları otomatik olarak ayarladım. Sekme kontrolü ana pencereye uzanır. Sekmelerdeki kontroller sekmeleri doldurmak için uzar. Buradaki bilgiler cevaplardan geldi. Sadece tam bir örnek oluşturdum. Bu kişiye yararlıdır

Umut.

 <TabControl HorizontalAlignment="Stretch" 
       Margin="91,0,0,0" Name="tabControl1" 
       VerticalAlignment="Stretch" > 
     <TabItem Header="DataGrid" Name="tabItem1"> 
      <Grid> 
       <DataGrid AutoGenerateColumns="False" 
          HorizontalAlignment="Stretch" 
          Name="dgFTPLog" 
          VerticalAlignment="Stretch" 
          Margin="6,6,0,0" /> 
      </Grid> 
     </TabItem> 
     <TabItem Header="Log" Name="tabItem2"> 
      <Grid> 
       <TextBox 
         HorizontalAlignment="Stretch" 
         Margin="6,6,0,0" Name="txtLog" 
         VerticalAlignment="Stretch" 
         VerticalScrollBarVisibility="Auto" 
         HorizontalScrollBarVisibility="Auto" 
         TextChanged="txtLog_TextChanged" /> 
      </Grid> 
     </TabItem> 
    </TabControl> 
43

Bu da beni üzdüm neden oldu ve AlexK ışığı görmeme yardımcı oldu. Hile, Yükseklik ve Genişlik ayarlanamaz.Bunları AUTO olarak ayarlayın ve boyutu ayarlamak için MARGIN kullanın. HORIZONTALALIGNMENT ve VERTICALALIGNMENT öğelerini STRETCH olarak ayarlayın ve daha sonra bağlantı işlevi çalışır.

+0

Bu da karşılanması için çalışır. Sen benim günümü kurtardın. teşekkürler: D –

0

Ben de bu konularda rastladı ettik. ve ActualHeight ve ActualWidth özelliklerinin ana denetimine bağlanmayı denemesi, yalnızca bunun dışında XAML tarafından değil, arkasındaki kod aracılığıyla çalışır.

yani

private void parentControl_SizeChanged(object sender, SizeChangedEventArgs e) 
    { 
     childControl.Height = parentControl.ActualHeight; 
     childControl.Width = parentControl.ActualWidth; 
    } 
İlgili konular