سؤال

أقوم بإعادة نشر هذا السؤال لأنني لم أحصل على الكثير من الاستجابة في المرة الأخيرة، ونأمل أن يساعد القليل من إعادة الصياغة ...

في الأساس ما أحاول القيام به هو إنشاء قماش بيانات، من شأنه أن يطاق محتوياته تلقائيا إلى "ملء" المساحة المتوفرة. نوع من مثل التكبير / التكبير لتناسب العملية. لسوء الحظ، فإن مهاراتي WPF ليست قوية جدا، وأنا تكافح من أجل العمل كيفية القيام بهذا الجزء الأخير. لقد تابعت بعض أمثلة بيانات البيانات للحصول على قماش ملزمة، ولكن لست متأكدا مما إذا كان ربما خاطئا وعقبني.

لدي مشكلتان أساسيتان في الوقت الحالي اعتمادا على الطريقة التي أحاول بها ومعالجة الحل، إما:

  • لا أعرف كيفية جعل لوحة قماش تعمل تلقائيا من خلال XAML إذا كان ذلك ممكنا باستخدام تحويل.
  • لا يبدو لي أن أشير إلى القماش في الكود وراء ذلك، وأنا أظن لأن الجزء من البنودكونة؟

مثال على ما أحاول تحقيقه، لقد حصلت على AI ترغب في محاولة الحصول على B:

(إزالتها منتهية الصلاحية رابط إلى IMG)

الرمز الذي أستخدمه حاليا بسيط جدا، فقط إنشاء 4 نقاط مع تنسيق معين ونموذج عرض آخر لالتفاف هذه.

public class PointCollectionViewModel
{
    private List<PointViewModel> viewModels;
    public PointCollectionViewModel()
    {
        this.viewModels = new List<PointViewModel>();
        this.viewModels.Add(new PointViewModel(new Point(1, 1)));
        this.viewModels.Add(new PointViewModel(new Point(9, 9)));
        this.viewModels.Add(new PointViewModel(new Point(1, 9)));
        this.viewModels.Add(new PointViewModel(new Point(9, 1)));
    }

    public List<PointViewModel> Models
    {
        get { return this.viewModels; }
    }
}

public class PointViewModel
{
   private Point point;
   public PointViewModel(Point point)
   {
       this.point = point;
   }

   public Double X { get { return point.X; } }
   public Double Y { get { return point.Y; } }
}

ثم يتم استخدام PointCollectionViewModel كدورات بيانات لجهاز تلقائي الخاص بي، والذي يحتوي على XAML التالية لتنفيذ التجليد:

<UserControl x:Class="WpfCanvasTransform.AutoResizingCanvas"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfCanvasTransform"
    x:Name="parent">
    <ItemsControl x:Name="itemsControl" ItemsSource="{Binding Path=Models}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
        <Canvas x:Name="canvas" Background="DarkSeaGreen" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
            <Canvas.LayoutTransform>
            <ScaleTransform ScaleY="-1" />
            </Canvas.LayoutTransform>

        </Canvas>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate DataType="{x:Type local:PointViewModel}">
        <Ellipse Width="3" Height="3" Fill="Red"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
    <ItemsControl.ItemContainerStyle>
        <Style>
        <Setter Property="Canvas.Top" Value="{Binding Path=Y}"/>
        <Setter Property="Canvas.Left" Value="{Binding Path=X}"/>
        </Style>
    </ItemsControl.ItemContainerStyle>
    </ItemsControl>
</UserControl>
هل كانت مفيدة؟

المحلول

مثلك Canvas لا يبدو أن العرض الثابت والطول، وأود أن تدرجها في Viewbox:

<ItemsControl.ItemsPanel>
    <ItemsPanelTemplate>
        <Viewbox Stretch="Uniform">
            <Canvas x:Name="canvas" Background="DarkSeaGreen">
                <Canvas.LayoutTransform>
                <ScaleTransform ScaleY="-1" />
                </Canvas.LayoutTransform>
            </Canvas>
        </Viewbox>
    </ItemsPanelTemplate>
</ItemsControl.ItemsPanel>

بدلا من ذلك، ضع كله UserControl الى ViewBox.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top