2010-07-03 3 views
14

Возможно ли создать собственный пользовательский MessageBox, где бы я мог добавлять изображения вместо строк?Custom Message Box

+0

Вам не нужно изобретать колесо bro, у меня была такая же идея, чтобы создать свою собственную, но я искал и нашел решение, которое соответствовало моим потребностям, поскольку я положил его в ответ –

ответ

0

Несомненно. Я сделал это с помощью подклассов System.Windows.Window и добавления возможностей, чтобы показать различные виды контента (изображения, текст и элементы управления), а затем вызвать ShowDialog() на этом окне:

public partial class MyMessageBox : Window 
{ 
    // perhaps a helper method here 
    public static bool? Show(String message, BitmapImage image) 
    { 
     // NOTE: Message and Image are fields created in the XAML markup 
     MyMessageBox msgBox = new MyMessageBox() { Message.Text = message, Image.Source = image }; 
     return msgBox.ShowDialog(); 
    } 
} 

В XAML, что-то вроде этого:

<Window> 
    <DockPanel> 
     <Image Name="Image" DockPanel.Dock="Left" /> 
     <TextBlock Name="Message" /> 
    </DockPanel> 
</Window> 
+0

didn't работает со мной, в var msgBox сообщение и изображение дают мне ошибки! – sikas

+0

@sikas, вы должны использовать Visual Studio 2005. Синтаксис выше будет работать с новым компилятором C# в VS2008 и более поздних версиях. Если вы застряли с VS2005, замените строку «var msgBox ...» тремя строками: «MyMessageBox msgBox = new MyMessageBox();», «msgBox.Message = message;» и «msgBox.Image = image; ». –

+0

@silkas - крик, извините, я сейчас так привык к C# 3.0 ... Джо прав, и я отредактировал ответ, чтобы отразить его предложения. – codekaizen

15

Проверить тезисы статей, в которых показано, как создавать пользовательские диалоги с использованием WPF

alt text http://karlshifflett.files.wordpress.com/2007/12/sampleone.jpg

+0

Хорошие ссылки @RRUZ !!! –

+0

отлично. мне это очень помогает;) – asitis

2

Я реализовал WPF MessageBox полностью настраиваемый с помощью стандартных шаблонов управления WPF:

http://blogs.microsoft.co.il/blogs/arik/archive/2011/05/26/a-customizable-wpf-messagebox.aspx

Особенности

  • Класс WPFMessageBox имеет тот же интерфейс, что и текущий класс WPF MessageBox.
  • Реализован как пользовательский элемент управления, полностью настраиваемый с помощью стандартных шаблонов управления WPF.
  • Имеет шаблон управления по умолчанию, который выглядит как стандартный MessageBox.
  • Поддерживает все распространенные типы сообщений: ошибка, предупреждение, вопрос и информация.
  • Звучит так же, как при открытии стандартного MessageBox.
  • Поддерживает такое же поведение при нажатии кнопки Escape в качестве стандартного MessageBox.
  • Предоставляет такое же системное меню, как и стандартное MessageBox, включая отключение кнопки «Закрыть», когда окно сообщения находится в режиме «Да-Нет».
  • Обрабатывает выровненные по правому краю и справа налево операционные системы, аналогичные стандартным MessageBox.
  • Обеспечивает поддержку установки окна владельца в качестве элемента управления WinForms.
+0

можно ли использовать для C# winform? –

20

Я также хотел эту функцию, так что я создал WPFCustomMessageBox, клон WPF родной Windows/.NET MessageBox, который поддерживает дополнительные функции, такие как пользовательские кнопки текст.

WPFCustomMessageBox использует статические методы, как и стандартный .NET MessageBox, так что вы можете plug-and-play новую библиотеку без изменения какого-либо кода. Самое главное, я разработал этот элемент управления так, чтобы он был похож на оригинал MessageBox.

WPFCustomMessageBox example

Я создал эту библиотеку, потому что я хотел использовать глаголы для моих кнопок MessageBox к help users better understand the functionality of the buttons. С помощью этой библиотеки вы можете предлагать описания своих пользователей, например, Save/Don't Save или Eject Fuel Rods/Don't do it!, а не стандартные OK/Cancel или Yes/No (хотя вы все равно можете их использовать, если хотите).

Почтовые ящики WPFCustomMessageBox возвращают standard .NET MessageBoxResults. Он также предлагает те же функции, что и оригинал MessageBox, например MessageBoxIcons и подписи под подпиской.

WPFCustomMessageBox является открытым исходным кодом, так что вы можете получить код или внести улучшения здесь: https://github.com/evanwon/WPFCustomMessageBox

Вы можете добавить WPFCustomMessage в свой проект с помощью NuGet: https://www.nuget.org/packages/WPFCustomMessageBox/

+0

+1 для топливных стержней ... единственное, чего не хватает: «потрачено» ... «Отработанные топливные стержни»! : P – Shaamaan

+3

Основные принципы дизайна пользовательского интерфейса говорят, что вы можете захотеть сделать «Не делай этого!». кнопка по умолчанию, а не другая. ;-) – Tenner

+0

@Tenner Основные принципы ядра ядерного топлива, вероятно, согласны с этим :) –

7

Вот код, необходимый для создания своего собственного сообщения ящик:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace MyStuff 
{ 
    public class MyLabel : Label 
    { 
     public static Label Set(string Text = "", Font Font = null, Color ForeColor = new Color(), Color BackColor = new Color()) 
     { 
      Label l = new Label(); 
      l.Text = Text; 
      l.Font = (Font == null) ? new Font("Calibri", 12) : Font; 
      l.ForeColor = (ForeColor == new Color()) ? Color.Black : ForeColor; 
      l.BackColor = (BackColor == new Color()) ? SystemColors.Control : BackColor; 
      l.AutoSize = true; 
      return l; 
     } 
    } 
    public class MyButton : Button 
    { 
     public static Button Set(string Text = "", int Width = 102, int Height = 30, Font Font = null, Color ForeColor = new Color(), Color BackColor = new Color()) 
     { 
      Button b = new Button(); 
      b.Text = Text; 
      b.Width = Width; 
      b.Height = Height; 
      b.Font = (Font == null) ? new Font("Calibri", 12) : Font; 
      b.ForeColor = (ForeColor == new Color()) ? Color.Black : ForeColor; 
      b.BackColor = (BackColor == new Color()) ? SystemColors.Control : BackColor; 
      b.UseVisualStyleBackColor = (b.BackColor == SystemColors.Control); 
      return b; 
     } 
    } 
    public class MyImage : PictureBox 
    { 
     public static PictureBox Set(string ImagePath = null, int Width = 60, int Height = 60) 
     { 
      PictureBox i = new PictureBox(); 
      if (ImagePath != null) 
      { 
       i.BackgroundImageLayout = ImageLayout.Zoom; 
       i.Location = new Point(9, 9); 
       i.Margin = new Padding(3, 3, 2, 3); 
       i.Size = new Size(Width, Height); 
       i.TabStop = false; 
       i.Visible = true; 
       i.BackgroundImage = Image.FromFile(ImagePath); 
      } 
      else 
      { 
       i.Visible = true; 
       i.Size = new Size(0, 0); 
      } 
      return i; 
     } 
    } 
    public partial class MyMessageBox : Form 
    { 
     private MyMessageBox() 
     { 
      this.panText = new FlowLayoutPanel(); 
      this.panButtons = new FlowLayoutPanel(); 
      this.SuspendLayout(); 
      // 
      // panText 
      // 
      this.panText.Parent = this; 
      this.panText.AutoScroll = true; 
      this.panText.AutoSize = true; 
      this.panText.AutoSizeMode = AutoSizeMode.GrowAndShrink; 
      //this.panText.Location = new Point(90, 90); 
      this.panText.Margin = new Padding(0); 
      this.panText.MaximumSize = new Size(500, 300); 
      this.panText.MinimumSize = new Size(108, 50); 
      this.panText.Size = new Size(108, 50); 
      // 
      // panButtons 
      // 
      this.panButtons.AutoSize = true; 
      this.panButtons.AutoSizeMode = AutoSizeMode.GrowAndShrink; 
      this.panButtons.FlowDirection = FlowDirection.RightToLeft; 
      this.panButtons.Location = new Point(89, 89); 
      this.panButtons.Margin = new Padding(0); 
      this.panButtons.MaximumSize = new Size(580, 150); 
      this.panButtons.MinimumSize = new Size(108, 0); 
      this.panButtons.Size = new Size(108, 35); 
      // 
      // MyMessageBox 
      // 
      this.AutoScaleDimensions = new SizeF(8F, 19F); 
      this.AutoScaleMode = AutoScaleMode.Font; 
      this.ClientSize = new Size(206, 133); 
      this.Controls.Add(this.panButtons); 
      this.Controls.Add(this.panText); 
      this.Font = new Font("Calibri", 12F, FontStyle.Regular, GraphicsUnit.Point, ((byte)(0))); 
      this.FormBorderStyle = FormBorderStyle.FixedSingle; 
      this.Margin = new Padding(4); 
      this.MaximizeBox = false; 
      this.MinimizeBox = false; 
      this.MinimumSize = new Size(168, 132); 
      this.Name = "MyMessageBox"; 
      this.ShowIcon = false; 
      this.ShowInTaskbar = false; 
      this.StartPosition = FormStartPosition.CenterScreen; 
      this.ResumeLayout(false); 
      this.PerformLayout(); 
     } 
     public static string Show(Label Label, string Title = "", List<Button> Buttons = null, PictureBox Image = null) 
     { 
      List<Label> Labels = new List<Label>(); 
      Labels.Add(Label); 
      return Show(Labels, Title, Buttons, Image); 
     } 
     public static string Show(string Label, string Title = "", List<Button> Buttons = null, PictureBox Image = null) 
     { 
      List<Label> Labels = new List<Label>(); 
      Labels.Add(MyLabel.Set(Label)); 
      return Show(Labels, Title, Buttons, Image); 
     } 
     public static string Show(List<Label> Labels = null, string Title = "", List<Button> Buttons = null, PictureBox Image = null) 
     { 
      if (Labels == null) Labels = new List<Label>(); 
      if (Labels.Count == 0) Labels.Add(MyLabel.Set("")); 
      if (Buttons == null) Buttons = new List<Button>(); 
      if (Buttons.Count == 0) Buttons.Add(MyButton.Set("OK")); 
      List<Button> buttons = new List<Button>(Buttons); 
      buttons.Reverse(); 

      int ImageWidth = 0; 
      int ImageHeight = 0; 
      int LabelWidth = 0; 
      int LabelHeight = 0; 
      int ButtonWidth = 0; 
      int ButtonHeight = 0; 
      int TotalWidth = 0; 
      int TotalHeight = 0; 

      MyMessageBox mb = new MyMessageBox(); 

      mb.Text = Title; 

      //Image 
      if (Image != null) 
      { 
       mb.Controls.Add(Image); 
       Image.MaximumSize = new Size(150, 300); 
       ImageWidth = Image.Width + Image.Margin.Horizontal; 
       ImageHeight = Image.Height + Image.Margin.Vertical; 
      } 

      //Labels 
      List<int> il = new List<int>(); 
      mb.panText.Location = new Point(9 + ImageWidth, 9); 
      foreach (Label l in Labels) 
      { 
       mb.panText.Controls.Add(l); 
       l.Location = new Point(200, 50); 
       l.MaximumSize = new Size(480, 2000); 
       il.Add(l.Width); 
      } 
      Labels.ForEach(l => l.MinimumSize = new Size(Labels.Max(x => x.Width), 1)); 
      mb.panText.Height = Labels.Sum(l => l.Height); 
      mb.panText.MinimumSize = new Size(Labels.Max(x => x.Width) + mb.ScrollBarWidth(Labels), ImageHeight); 
      mb.panText.MaximumSize = new Size(Labels.Max(x => x.Width) + mb.ScrollBarWidth(Labels), 300); 
      LabelWidth = mb.panText.Width; 
      LabelHeight = mb.panText.Height; 

      //Buttons 
      foreach (Button b in buttons) 
      { 
       mb.panButtons.Controls.Add(b); 
       b.Location = new Point(3, 3); 
       b.TabIndex = Buttons.FindIndex(i => i.Text == b.Text); 
       b.Click += new EventHandler(mb.Button_Click); 
      } 
      ButtonWidth = mb.panButtons.Width; 
      ButtonHeight = mb.panButtons.Height; 

      //Set Widths 
      if (ButtonWidth > ImageWidth + LabelWidth) 
      { 
       Labels.ForEach(l => l.MinimumSize = new Size(ButtonWidth - ImageWidth - mb.ScrollBarWidth(Labels), 1)); 
       mb.panText.Height = Labels.Sum(l => l.Height); 
       mb.panText.MinimumSize = new Size(Labels.Max(x => x.Width) + mb.ScrollBarWidth(Labels), ImageHeight); 
       mb.panText.MaximumSize = new Size(Labels.Max(x => x.Width) + mb.ScrollBarWidth(Labels), 300); 
       LabelWidth = mb.panText.Width; 
       LabelHeight = mb.panText.Height; 
      } 
      TotalWidth = ImageWidth + LabelWidth; 

      //Set Height 
      TotalHeight = LabelHeight + ButtonHeight; 

      mb.panButtons.Location = new Point(TotalWidth - ButtonWidth + 9, mb.panText.Location.Y + mb.panText.Height); 

      mb.Size = new Size(TotalWidth + 25, TotalHeight + 47); 
      mb.ShowDialog(); 
      return mb.Result; 
     } 

     private FlowLayoutPanel panText; 
     private FlowLayoutPanel panButtons; 
     private int ScrollBarWidth(List<Label> Labels) 
     { 
      return (Labels.Sum(l => l.Height) > 300) ? 23 : 6; 
     } 

     private void Button_Click(object sender, EventArgs e) 
     { 
      Result = ((Button)sender).Text; 
      Close(); 
     } 

     private string Result = ""; 
    } 
} 

Это заняло у меня 2 дня, чтобы написать. Надеюсь, это работает для тех, кому это нужно.

0

я был в необходимости, как вы и я нашел этот источник и изменить так, как я хотел, и вы могли бы получить максимальную выгоду из этого

здесь ссылка enter link description here это то, что он выглядит по умолчанию enter image description here