Tôi đang hiển thị Hình ảnh WPF (UserControl) thành bitmap nhưng vấn đề là hình ảnh được hiển thị là kích thước của UserControl trước khi được thu nhỏ/chuyển đổi. Vì vậy, hãy nói rằng UserControl được thiết kế ở 200x200 pixel. Khi tôi render đến BMP, tôi đang sử dụng ActualWidth và ActualHeightt của UserControl, báo cáo tương ứng là 200 và 200. Vấn đề là UserControl nằm trong Canvas và có kích thước tự động (được đặt thành tỷ lệ/tô màu với kích thước cửa sổ) đến gần 1200 x 1200 (thay đổi)Cách lấy kích thước được chia tỷ lệ của phần tử Hình ảnh WPF
Tôi đã đọc và tìm kiếm và cho đến nay 't tìm ra cách để xác định kích thước hiệu quả, đó là kích thước điều khiển đang được vẽ trên màn hình.
Tôi đã xem qua câu hỏi này nghe có vẻ hy vọng nhưng Chuyển đổi được trả lại không chứa dữ liệu mở rộng. Vâng, nhưng cả hai đều là 1. Get element position after transform
Bất kỳ đề xuất nào về tìm kiếm tỷ lệ hiển thị sẽ tuyệt vời!
[UPDATE] Như đã đề cập, tôi bao gồm cả mã có liên quan:
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);
}
[Update # 2] Added XAML - Yếu tố Lưới đã được gỡ bỏ bởi vì nó là HUGE và từ của tôi việc đọc XAML Canvas chứa bàn phím UserControl KHÔNG phải là một phần của phần tử Grid.
<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>
Loại chuyển đổi nào được áp dụng cho điều khiển? LayoutTransform hoặc/và RenderTransform? Bạn có ý nghĩa gì bởi "kích thước tự động"? –
@Erno - Thành thật mà nói, tôi không hoàn toàn chắc chắn. Tôi mới, tôi mới hơn so với WPF và chưa nắm bắt được các công cụ Layout. Có vẻ như UserControl nằm bên trong Canvas được cấu hình để mở rộng theo chiều rộng và chiều cao –
rồi hiển thị cho chúng tôi mã để chúng tôi có thể trợ giúp. –