简而言之:
我的目标是在 WPF/C#/XAML 中制作一个按钮控件,它可以有一个 system.windows.controls.image (从现在开始:图像)作为内容,我想把它作为左上角的像素并制作其余的内容背景颜色与图像相同。图片的图片是项目的资源。现在我的问题是,我根本无法获得左上角的像素,或者我无法获得按钮上的图片。经过一番谷歌搜索后,我尝试了几种方法。
第一:我使用图片作为嵌入式资源。这样我可以通过加载图片的前 4 个字节来获取左上角的像素,但图片不会显示在按钮上。
第二:我使用图片作为资源。这样我可以看到按钮上的图像,但我无法获得像素颜色,因为当我尝试访问图片时,它会破坏程序并显示有关图片不存在的错误消息。
详细地:
app.xaml 中的按钮:
<Style TargetType="Button" BasedOn="{StaticResource GombAlap}" x:Key="GombM">
<!-- BasedOn="{StaticResource {x:Type Button}}" -->
<Setter Property="Width" Value="200" />
<Setter Property="Margin" Value="0,0,10,0" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Grid>
<Grid Background="{TemplateBinding Background}" Opacity="0.2" />
<DockPanel Margin="{TemplateBinding Padding}">
<Grid Background="White" DockPanel.Dock="Bottom" Visibility="{TemplateBinding Tag, Converter={StaticResource StringEmptyVisibleVagyCollapse}}">
<TextBlock Text="{TemplateBinding Tag}" />
</Grid>
<!-- kép -->
<Viewbox Margin="{TemplateBinding Padding}">
<ContentPresenter Margin="{TemplateBinding Padding}" />
</Viewbox>
</DockPanel>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
这是一个简单的东西:我使用 button.tag 作为文本(如果没有给出,我隐藏该区域)。内容可以是任何内容,并覆盖按钮的其余部分。
我尝试使用的代码(抱歉没有翻译评论):
ÚjMenüpont("Exit to Windows", FStatic.ImageResourceből("../Gombok/Windows8.png"), delegate { Close(); }); //kilépés gomb
这将调用按钮初始化程序。参数是:文本、图像和点击处理程序。所以这只会关闭主窗口。让我们看看首先加载图像的内容:
public static Image ImageResourceből(string Név)
{
Image eredmény = new Image();
BitmapImage bi = new BitmapImage(new Uri(Név, UriKind.RelativeOrAbsolute));
eredmény.Source = bi;
return eredmény;
}
这实际上有效..加载图像,就是这样。让我们看看我上面调用的 ÚjMenüpont 代码:
void ÚjMenüpont(string Név, object Tartalom, Action Feladat)
{
Button új = new Button(); //új gomb
új.Tag = Név; //ez lesz az alsó szöveg
új.Content = Tartalom; //ez az objektum lesz a főrészen
if (Tartalom is Image)
{
//ha tartalom kép, a színt a bal felső sarokhoz igazítom
Image képként = Tartalom as Image; //képként értelmezem
var balfelső = new byte[4]; //buffer
Assembly futtató = Assembly.GetExecutingAssembly();
System.Drawing.Image kép = System.Drawing.Bitmap.FromStream(futtató.GetManifestResourceStream(
futtató.FullName.Substring(0, futtató.FullName.IndexOf(",")).Replace(" ", "_").Replace("../", string.Empty) + "." + képként.Source.ToString().Replace("../", string.Empty).Replace("/", ".")
));
System.Drawing.Color szín = ((System.Drawing.Bitmap)(kép)).GetPixel(0, 0);
új.Background = new SolidColorBrush(Color.FromRgb(szín.R, szín.G, szín.B));
//új.Content = ZXF.Konvertálók.KonvertálImagera.Graphicsból(System.Drawing.Graphics.FromImage(kép));
}
új.Click += new RoutedEventHandler( //gombnyomáskor ez történik
delegate(object sender, RoutedEventArgs args) //anoním eljárás click paramétereivel
{
//végrehajtom a feladatot
Feladat(); //ami a paraméter
}
);
Menü.Children.Add(új); //menüsávra teszem
}
首先它创建按钮,然后将文本传递到标签中。检查内容是否为图像。如果是,它将尝试获取左上角的像素。现在...
当图片是嵌入资源时,程序将运行但不会显示图像(仅来自设计师,不知何故),但按钮背景将是完美的。
从设计师看来,它是这样的:
但是当我尝试用作资源(而不是嵌入式资源)时,我会休息一下,因为没有这样的资源可用:
我检查了其他方法以获取左上角,但是当我运行代码时,我得到了不存在的消息 - 在运行时,资源......到目前为止,这是我可以放在一起的最好的工作代码。
所以问题是:
我怎么能也显示图片,或者我怎样才能得到左上角的像素?