image控件的source是在前端赋值的,代码如下: <Image HorizontalAlignment="Left" Margin="20 0 0 0" VerticalAlignment="Center" x:Name="img" Stretch="Uniform" Width="50" Height="50" Source="sview_icon.png" /> 现在我想在后台将source转为bitmapimage,但是用下面的方法得到的是null: BitmapImage bitmapImage = image.Source as BitmapImage; 我还能通过什么方法来转换,请给出详细代码
时间: 2023-07-06 20:16:48 浏览: 299
对于通过前端直接设置 Source 属性的 Image 控件,可以使用以下代码将其转换为 BitmapImage 对象:
```csharp
// 获取 Image 控件的 Source 属性
var source = img.Source;
// 如果 Image 控件的 Source 属性为 null 则无法转换为 BitmapImage 对象
if (source == null)
{
return;
}
// 创建 BitmapImage 对象并将 Image 控件的 Source 属性赋值给它
BitmapImage bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.UriSource = new Uri(source.ToString());
bitmapImage.EndInit();
// 现在 bitmapImage 对象就是 Image 控件的源图像了,可以使用它进行进一步的处理
```
这里我们首先获取了 Image 控件的 Source 属性,然后将其转换为字符串类型,并将其作为 UriSource 赋值给新创建的 BitmapImage 对象。需要注意的是,在将字符串转换为 UriSource 时,可能需要使用 `pack://application:,,,/` 前缀指定应用程序中的资源。如果你的图像资源不是应用程序资源,则需要使用正确的路径。
相关问题
<Style x:Key="WorkspaceItemStyle" TargetType="{x:Type MenuItem}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type MenuItem}"> <Border Name="bg" Height="30" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"> <Grid Margin="5" HorizontalAlignment="Stretch"> <Grid.ColumnDefinitions> <ColumnDefinition Width="30" /> <ColumnDefinition /> </Grid.ColumnDefinitions> <svg:SvgViewbox Width="16" Height="16" Margin="4,0,0,0" HorizontalAlignment="Left" VerticalAlignment="Center" Source="{Binding Icon, RelativeSource={RelativeSource TemplatedParent}}" /> <TextBlock x:Name="_txt" Grid.Column="1" Margin="0,0,15,0" VerticalAlignment="Center" Foreground="Black" Text="{Binding Header, RelativeSource={RelativeSource TemplatedParent}}" /> </Grid> </Border> <ControlTemplate.Triggers> <Trigger Property="IsMouseOver" Value="true"> <Setter TargetName="bg" Property="Background" Value="#e6eaf2" /> <Setter Property="IsSubmenuOpen" Value="True" /> </Trigger> <Trigger Property="IsEnabled" Value="False"> <Setter Property="Opacity" Value="0.6" /> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style>为什么这个样式没有让MenuItem的子菜单展开
从提供的样式代码来看,你已经将 IsSubmenuOpen 属性的值设置为 True,但是这并不足以让子菜单展开。在 WPF 中,要让 MenuItem 的子菜单展开,需要使用 Menu 控件,并在其中定义 MenuItem 的层次结构。
在你的样式中,你只是定义了 MenuItem 的外观,但没有提供子菜单的逻辑。你需要在 Menu 控件中使用你的样式,并在其中定义 MenuItem 的层次结构,才能实现子菜单的展开。
以下是一个示例,演示如何使用你提供的样式来创建具有子菜单的 MenuItem:
```xml
<Menu>
<MenuItem Header="File" Style="{StaticResource WorkspaceItemStyle}">
<MenuItem Header="New" />
<MenuItem Header="Open" />
<MenuItem Header="Save" />
</MenuItem>
<MenuItem Header="Edit" Style="{StaticResource WorkspaceItemStyle}">
<MenuItem Header="Cut" />
<MenuItem Header="Copy" />
<MenuItem Header="Paste" />
</MenuItem>
</Menu>
```
上述示例中,我们将样式应用于 Menu 控件中的每个 MenuItem。每个 MenuItem 都有一个 Header 属性来显示文本内容,并且可以包含其他 MenuItem 作为子菜单。当鼠标悬浮在 MenuItem 上时,样式中的触发器将会改变背景颜色,并且由于子菜单的逻辑已经由 Menu 控件处理,所以不需要手动设置 IsSubmenuOpen 属性。
请注意,样式只定义了外观,子菜单的内容和逻辑需要在代码中进行定义。
<Grid x:Name="grid_1" Grid.Row="0" Margin="7, 7, 7, 50" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" > <TextBox x:Name="txtPONumbersStr" HorizontalAlignment="Center" TextWrapping="Wrap" VerticalAlignment="Top" Text="{Binding Path = PONumbersStr, Mode=TwoWay}" InputMethod.IsInputMethodEnabled ="False" PreviewTextInput="TextBox_PONumbersStr_PreviewTextInput" IsEnabled="{Binding Path=IsEnabled}" Width="{Binding ElementName=grid, Path=ActualWidth}" Height="{Binding ElementName=grid, Path=ActualHeight}" /> </Grid>, 调整代码, 使得TextBox的边框显示出来
可以在TextBox标签中添加一个Border标签,并将TextBox放在其中,代码如下:
```
<Grid x:Name="grid_1" Grid.Row="0" Margin="7, 7, 7, 50" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" >
<Border BorderThickness="1" BorderBrush="Black">
<TextBox x:Name="txtPONumbersStr"
HorizontalAlignment="Center"
TextWrapping="Wrap"
VerticalAlignment="Top"
Text="{Binding Path = PONumbersStr, Mode=TwoWay}"
InputMethod.IsInputMethodEnabled ="False"
PreviewTextInput="TextBox_PONumbersStr_PreviewTextInput"
IsEnabled="{Binding Path=IsEnabled}"
Width="{Binding ElementName=grid, Path=ActualWidth}"
Height="{Binding ElementName=grid, Path=ActualHeight}" />
</Border>
</Grid>
```
在Border标签中设置BorderThickness和BorderBrush属性来定义边框的样式,可以根据需要进行调整。
阅读全文