2011-10-10 30 views
6

Bir bitmap'e bir WPF Visual (UserControl) oluşturuyorum ancak sorun, oluşturulmuş görüntünün ölçeklendirilmeden/dönüştürülmeden önce UserControl öğesinin boyutudur. Yani, UserControl'ün 200x200 piksel olarak tasarlandığını varsayalım. BMP'ye verdiğimde, sırasıyla 200 ve 200'ü rapor eden UserControl'ün ActualWidth ve ActualHeightt'ını kullanıyorum. Sorun, UserControl bir Tuval içinde ve 1200 x 1200 (bu değiştirir)Bir WPF Görsel öğesinin ölçeklendirilmiş boyutu nasıl elde edilir

daha yakın bir şey için otomatik boyut (Pencere boyutu ile ölçeklemek/doldurmak için ayarlanır) Bazı okuma ve arama yaptım ve şimdiye kadar yapabilirsiniz Etkili boyutun nasıl belirleneceğini, yani kontrolün ekranda boyandığı boyut olduğunu anlamaya çalışın.

Bu soruya ümitli geldiğim halde geldim, ancak Dönüştürme döndürülen verilerde ölçekleme verisi içermiyor. Peki, ancak her ikisi de 1'dir. Get element position after transform

Oluşturma ölçeklendirmesi için nereye bakmanız gerektiği ile ilgili öneriler harika olurdu!

[GÜNCELLEME] ben ilgili koduyla birlikte ediyorum önerilen gibi:

public static Bitmap PngBitmap(this Visual visual) 
{ 
    // Get height and width 
    int width = (int)(double)visual.GetValue(
     FrameworkElement.ActualWidthProperty); 
    int height = (int)(double)visual.GetValue(
     FrameworkElement.ActualHeightProperty); 

    // Render 
    RenderTargetBitmap rtb = 
     new RenderTargetBitmap(
      width, 
      height, 
      96, 
      96, 
      PixelFormats.Default); 
    rtb.Render(visual); 

    // Encode 
    PngBitmapEncoder encoder = new PngBitmapEncoder(); 
    encoder.Frames.Add(BitmapFrame.Create(rtb)); 
    System.IO.MemoryStream stream = new System.IO.MemoryStream(); 
    encoder.Save(stream); 

    // Create Bitmap 
    Bitmap bmp = new Bitmap(stream); 
    stream.Close(); 

    return bmp; 
} 

public static BitmapSource BitmapSource(this Visual visual) 
{ 
    Bitmap bmp = visual.PngBitmap(); 
    IntPtr hBitmap = bmp.GetHbitmap(); 
    BitmapSizeOptions sizeOptions = BitmapSizeOptions.FromEmptyOptions(); 
    return Imaging.CreateBitmapSourceFromHBitmap(
         hBitmap, 
         IntPtr.Zero, 
         Int32Rect.Empty, 
         sizeOptions); 
} 

[Güncelleme # 2] Eklendi XAML - Izgara elemanı çok büyük oldu çünkü çıkarılıp gelen edildi benim Klavyenin UserControl dosyasını içeren XAML'in okunması, Kılavuz öğesinin bir parçası DEĞİLDİR.

<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:PMD.HECAT.DashboardModule" 
    xmlns:PMD_HECAT_DashboardModule_VirtualKeyboard="clr-namespace:PMD.HECAT.DashboardModule.VirtualKeyboard" 
    xmlns:System_Windows_Controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Input.Toolkit" 
    xmlns:PMD_HECAT_DashboardModule_Input="clr-namespace:PMD.HECAT.DashboardModule.Input" 
    xmlns:control="clr-namespace:PMD.HECAT.DashboardModule.Controls"  
    x:Class="PMD.HECAT.DashboardModule.CandidateElectrodeView"    
    x:Name="UserControl" 
    mc:Ignorable="d" 
    d:DesignWidth="1024" d:DesignHeight="768" Width="640" Height="360"> 
    <UserControl.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="../Themes/DashboardStyles.xaml" /> 
       <ResourceDictionary Source="../Themes/ImageButtons.xaml" /> 
       <ResourceDictionary Source="CandidateViewResources.xaml" /> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary>   
    </UserControl.Resources> 
    <UserControl.Triggers> 
     <EventTrigger RoutedEvent="PMD_HECAT_DashboardModule_VirtualKeyboard:VirtualKeyboardView.KeyboardClose" SourceName="virtualKeyboardView"> 
      <BeginStoryboard Storyboard="{StaticResource OnKeyboardClose1}"/> 
     </EventTrigger> 
    </UserControl.Triggers> 
    <Canvas Width="100" HorizontalAlignment="Left"> 

     <PMD_HECAT_DashboardModule_VirtualKeyboard:VirtualKeyboardView x:Name="virtualKeyboardView" Height="222" Width="550" RenderTransformOrigin="0.5,0.5" Opacity="0" Active="False"> 
      <PMD_HECAT_DashboardModule_VirtualKeyboard:VirtualKeyboardView.RenderTransform> 
       <TransformGroup> 
        <ScaleTransform/> 
        <SkewTransform/> 
        <RotateTransform/> 
        <TranslateTransform X="40" Y="400"/> 
       </TransformGroup> 
      </PMD_HECAT_DashboardModule_VirtualKeyboard:VirtualKeyboardView.RenderTransform> 
     </PMD_HECAT_DashboardModule_VirtualKeyboard:VirtualKeyboardView> 
     <Rectangle Stroke="White" Opacity="0.7" Fill="White" Height="370" Width="654.851" Canvas.Left="687" Canvas.Top="0" /> 
    </Canvas> 
</UserControl> 
+0

Kontrole ne tür bir dönüşüm uygulanır? LayoutTransform veya/ve RenderTransform? "Otomatik boy" ile ne demek istiyorsun? –

+0

@Erno - Dürüst olmak gerekirse tamamen emin değilim. Ben yeniyim, WPF'ye göre daha yeniyim ve henüz Layout araçlarını anlamadım. UserControl, genişliğini ve yüksekliğini –

+0

olarak genişletmek üzere yapılandırılmış bir Tuval'in içinde yer alıyor ve bize yardım edebilmemiz için kodu bize gösteriyor. –

cevap

5

geçtim çok zaman biliyorum ama biraz daha bilgi :)

I (dönüşümü kılmasıdır uygulamalı s ile görsellerin boyutunu (ölçek) bulmak için bu kodu kullanmak göndermek için zarar vermez).bu UIElement fore en azından benim durumumda çalışır

 uiElement.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); 
     uiElement.Arrange(new Rect(new Point(0, 0), uiElement.DesiredSize)); 
     Size _size = uiElement.DesiredSize; 

render bunu Render için Boyutu zorlamak için önce görsel ekranda değilse

GeneralTransform t = transformedVisual.TransformToVisual(parentVisual); 

Vector topLeft = (Vector) t.Transform(new Point(0,0)); 
Vector topRight = (Vector) t.Transform(new Point(originalWidthOfTransformedVisual, 0)); 

double renderedWidth = (topRight-topLeft).Length; 
double widthScale = renderedWidth/originalWidthOfTransformedVisual; 
+3

Daha genel olarak, bir kişinin basitçe göreli bağını ebeveyn ile ilgili olarak hesaplayabileceğini unutmayın: 'Rect sınırları = t .TransformBounds (yeni Boyut (yeni Boyut (yeni Boyut (transformedVisual.ActualWidth, transformedVisual.ActualHeight)); ”Tabii ki, bunun çalışması için,' transformedVisual'ın basit bir 'Visual' yerine bir 'FrameworkElement' olması gerekir. kendi başına herhangi bir boyut bilgisi yoktur). –

0

Görsel'in genişliğini ve yüksekliğini kullandığınızı söylüyorsunuz. İlk önce iki sorun var. A Visual, http://msdn.microsoft.com/en-us/library/system.windows.media.visual.aspx Yükseklik ve Genişlik için herhangi bir Özellikler yoktur.

Şimdi, Yükseklik ve Genişlik özelliğine sahip bir FrameworkElement öğesinin olduğunu varsayarak Yükseklik ve Genişlik Özellikleri'ni mi yoksa Gerçek Boyutlu ve GerçekKanalılık özelliklerini mi kullanıyorsunuz? Eğer değilseniz, o zaman aradığınız özelliklerdir.

Onları kullanıyorsanız veya bir FrameworkElement kullanmıyorsanız, bazı kodlar göndermelisiniz.

+0

Karışıklık için özür dilerim. Bu aslında bir UserControl ve ben ActualWidth ve ActualHeight kullanıyorum (Bu iletiyi açıklığa kavuşturmak için özgün iletimi güncelleştirdim) –

0

Animasyonu Transform gerçekleştirmek için kullanabiliyorsanız, animasyon Completed olay sağlar. Yeni dönüştürülmüş boyutu çıkarmak için iyi bir yer olmalı. sorusu sorulmuştur beri

0
public static Rect GetRelativePlacement(this UIElement element, UIElement relativeTo) 
    { 
     var absolutePos = element.PointToScreen(new Point(0, 0)); 
     var posRelativeTo = relativeTo.PointToScreen(new Point(0, 0)); 

     var topLeft = new Point(absolutePos.X - posRelativeTo.X, absolutePos.Y - posRelativeTo.Y); 
     var bottomRight = element.PointToScreen(new Point(element.RenderSize.Width, element.RenderSize.Height)); 

     var bounds = Rect.Empty; 
     bounds.Union(topLeft); 
     bounds.Union(bottomRight); 

     return bounds; 
    } 
1

Merhaba ben benzer bir sorun vardı

İlgili konular