ورود

View Full Version : زیبا سازی پروژه و بهترین Design ها



AbbasSediqi
یک شنبه 01 فروردین 1395, 10:39 صبح
با سلام خدمت همه اساتید

در این تاپیک سعی بر اینه که به نحو خوبی سعی در استفاده بهینه از قابلیت های wpf بشه


چیزی که تا به الان دیدم مخصوصا در برنامه نویسی wpf در ایران اینه که هنوزم سعی میکنن به روش winform برنامه تهیه کنن


در wpf راه های بسیار زیادی وجود داره تا پروژه های بسیار شاخص و زیبا طراحی و اجرا کرد


به طور مثال و برای نخستین حرکت کنترل gift برای فایل های متحرک که در صورت استفاده نمای بهتری به برنامه میده

using Microsoft.VisualBasic;using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Interop;
using System.Windows.Media.Imaging;
using System.Windows.Threading;


public class AnimatedGIFControl : System.Windows.Controls.Image
{


private Bitmap _bitmap;
// Local bitmap member to cache image resource
private BitmapSource _bitmapSource;
public delegate void FrameUpdatedEventHandler();


/// <summary>
/// Delete local bitmap resource
/// Reference: http://msdn.microsoft.com/en-us/library/dd183539(VS.85).aspx
/// </summary>
[DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool DeleteObject(IntPtr hObject);


/// <summary>
/// Override the OnInitialized method
/// </summary>
protected override void OnInitialized(EventArgs e)
{
base.OnInitialized(e);
}


/// <summary>
/// Load the embedded image for the Image.Source
/// </summary>
private void AnimatedGIFControl_Loaded(object sender, RoutedEventArgs e)
{
_bitmap = new Bitmap(Microsoft.VisualBasic.Right(Source.ToString , Strings.Len(Source.ToString) - 8));
_bitmapSource = Source;
}


/// <summary>
/// Close the FileStream to unlock the GIF file
/// </summary>
private void AnimatedGIFControl_Unloaded(object sender, RoutedEventArgs e)
{
StopAnimate();
}


/// <summary>
/// Start animation
/// </summary>
public void StartAnimate()
{
ImageAnimator.Animate(_bitmap, OnFrameChanged);
}


/// <summary>
/// Stop animation
/// </summary>
public void StopAnimate()
{
ImageAnimator.StopAnimate(_bitmap, OnFrameChanged);
}


/// <summary>
/// Event handler for the frame changed
/// </summary>
private void OnFrameChanged(object sender, EventArgs e)
{
Dispatcher.BeginInvoke(DispatcherPriority.Normal, new FrameUpdatedEventHandler(FrameUpdatedCallback));
}


private void FrameUpdatedCallback()
{
ImageAnimator.UpdateFrames();


if (_bitmapSource != null) {
_bitmapSource.Freeze();
}


// Convert the bitmap to BitmapSource that can be display in WPF Visual Tree
_bitmapSource = GetBitmapSource();
Source = _bitmapSource;
InvalidateVisual();
}


private BitmapSource GetBitmapSource()
{
IntPtr handle = IntPtr.Zero;


try {
handle = _bitmap.GetHbitmap();
_bitmapSource = Imaging.CreateBitmapSourceFromHBitmap(handle, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
} finally {
if (handle != IntPtr.Zero) {
DeleteObject(handle);
}
}


return _bitmapSource;
}
public AnimatedGIFControl()
{
Unloaded += AnimatedGIFControl_Unloaded;
Loaded += AnimatedGIFControl_Loaded;
}




}

Imports System.DrawingImports System.IO
Imports System.Runtime.InteropServices
Imports System.Windows
Imports System.Windows.Interop
Imports System.Windows.Media.Imaging
Imports System.Windows.Threading


Public Class AnimatedGIFControl
Inherits System.Windows.Controls.Image


Private _bitmap As Bitmap
' Local bitmap member to cache image resource
Private _bitmapSource As BitmapSource
Public Delegate Sub FrameUpdatedEventHandler()


''' <summary>
''' Delete local bitmap resource
''' Reference: http://msdn.microsoft.com/en-us/library/dd183539(VS.85).aspx
''' </summary>
<DllImport("gdi32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _
Private Shared Function DeleteObject(ByVal hObject As IntPtr) As Boolean
End Function


''' <summary>
''' Override the OnInitialized method
''' </summary>
Protected Overrides Sub OnInitialized(ByVal e As EventArgs)
MyBase.OnInitialized(e)
End Sub


''' <summary>
''' Load the embedded image for the Image.Source
''' </summary>
Private Sub AnimatedGIFControl_Loaded(ByVal sender As Object, ByVal e As RoutedEventArgs) Handles Me.Loaded
_bitmap = New Bitmap(Microsoft.VisualBasic.Right(Source.ToString , Len(Source.ToString) - 8))
_bitmapSource = Source
End Sub


''' <summary>
''' Close the FileStream to unlock the GIF file
''' </summary>
Private Sub AnimatedGIFControl_Unloaded(ByVal sender As Object, ByVal e As RoutedEventArgs) Handles Me.Unloaded
StopAnimate()
End Sub


''' <summary>
''' Start animation
''' </summary>
Public Sub StartAnimate()
ImageAnimator.Animate(_bitmap, AddressOf OnFrameChanged)
End Sub


''' <summary>
''' Stop animation
''' </summary>
Public Sub StopAnimate()
ImageAnimator.StopAnimate(_bitmap, AddressOf OnFrameChanged)
End Sub


''' <summary>
''' Event handler for the frame changed
''' </summary>
Private Sub OnFrameChanged(ByVal sender As Object, ByVal e As EventArgs)
Dispatcher.BeginInvoke(DispatcherPriority.Normal, New FrameUpdatedEventHandler(AddressOf FrameUpdatedCallback))
End Sub


Private Sub FrameUpdatedCallback()
ImageAnimator.UpdateFrames()


If _bitmapSource IsNot Nothing Then
_bitmapSource.Freeze()
End If


' Convert the bitmap to BitmapSource that can be display in WPF Visual Tree
_bitmapSource = GetBitmapSource()
Source = _bitmapSource
InvalidateVisual()
End Sub


Private Function GetBitmapSource() As BitmapSource
Dim handle As IntPtr = IntPtr.Zero


Try
handle = _bitmap.GetHbitmap()
_bitmapSource = Imaging.CreateBitmapSourceFromHBitmap(handle, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions())
Finally
If handle <> IntPtr.Zero Then
DeleteObject(handle)
End If
End Try


Return _bitmapSource
End Function




End Class

این هم یک نمونه فایل gif قرار دادم

http://s7.picofile.com/file/8244176418/gear_800_fullfixed641.gif

AbbasSediqi
یک شنبه 01 فروردین 1395, 10:45 صبح
این هم نمونه برای اشخاصی که از حالت عادی window خسته شدن و دوست دارن شخصی سازیش کنن

http://s7.picofile.com/file/8244176850/TCTMSWPF.rar.html

AbbasSediqi
یک شنبه 01 فروردین 1395, 11:00 صبح
این هم تصاویر از محیط برنامه ها

139659139660139661139662139663

AbbasSediqi
یک شنبه 01 فروردین 1395, 11:05 صبح
این هم یه پروژه کامل

لینک دانلود سورس و دمو http://www.codeproject.com/Articles/24127/The-WPF-Podcatcher-Series-Part-Structural-Skinni

139664

AbbasSediqi
یک شنبه 01 فروردین 1395, 11:15 صبح
این هم پروژه Color full Login در wpf به زیان csharp به همراه آموزش

http://www.c-sharpcorner.com/UploadFile/015c2d/color-full-login-form-in-wpf-windows-application/

139665

AbbasSediqi
یک شنبه 01 فروردین 1395, 11:23 صبح
خوب شاید تا الان منظورم رسونده باشم


به این برنامه نگاه بندازید ببینید برای طرای منو از چه ایده خلاقانه ای استفاده کرده

139666


به نظر شما برای زیبا سازی یه برنامه با توجه به قابلیت های WPF چه کار های میشه انجام داد


خوب اولیش رو که گفتم استفاده از ICon های زیبا و متحرک

دوم شخصی سازی حتی الامکان کنترل های پیش فرض

سوم نگاه کردن به برنامه به عنوان یه اثر هنری و سعی در چشنواز کردن برنامه

چهارم سعی در ایجاد رابط کاربری زیبا و در عین حال راحت

و ....


همه و همه این کار ها برای اینه که کاربر برای استفاده از برنامه ترقیب بشه و در صورت استفاده زیاد تایمی رو که کاربر خسته میشه رو به تاخییر بندازه



خوب پیشنهاد .........

birtemp
شنبه 04 اردیبهشت 1395, 16:51 عصر
رابط های کاربری زیبایی بودن. ولی بهتر از اینا هم میشه درست کرد ;)
WPF چیز غیرقابل وصفیه

MMR_1234
یک شنبه 05 اردیبهشت 1395, 01:00 صبح
دوست من
برنامه WPF کارائی زیادی داره
اما اگه ممکنه آموزشی در خصوص این موارد بزارید ممنون میشم

AbbasSediqi
سه شنبه 07 اردیبهشت 1395, 14:27 عصر
خوب بهتره از بنیان شروع کنم


اول از همه و شاید بهترین چیز برای شروع سفارشی کردن Window


خوب در ابتدا باید دو خاصیت زیر رو اضافه کنیم

ResizeMode="NoResize"
WindowStyle="None"

خوب در این حالت به طور کل کادر کناری و سر فصل و کنترل های close , minimize , Maximize رو از دست میدیم

اولین کار بعد از این اضافه کردن حالت ریسایزه

برای این کار باید reference زیر رو add کنید

presentationFramework

خوب بعد به ToolBox رفته و کلیک راست کرده و از choose items کنترل windowresizeframe رو add کنید

این کنترل رو در حقیقت همان ریسایزری که در حالت عادی مبینید

بعد یه border اضافه کنید برای حاشیه

در آخر هم با اضافه کردن سه کنترل ( حالا یا از button استفاده میکنید یا مثل من از image ) کنترل های close , minimize , maximize رو ایجاد کنید

برای حالت Drag and Drop

حالا خواستید اگر روی کل فرمتون باشه در mosemove فرم و اگه یه قسمت خاص مد نظرتونه یه کنترلی مثل label , border و یا هرچیز دیگه ای اضافه کنید و در mosemove اون کنترل دستور زیر رو قرار بدید

DragMove()

AbbasSediqi
سه شنبه 07 اردیبهشت 1395, 14:34 عصر
فواید سفارش کردن window


اول اینکه به دلخواه خودتون به طور کامل میتونید اعمال سلیقه کنید


دو تمام حجم فرم در اختیاتونه و میتونید در هر نقطه ای از فرم اگر خواستید حتی در title شخصی سازیتون رو انجام بدید

سوم شما رو از استفاده از component برای این کار بی نیاز میکنه چون component باعث سنگینی برنامه میشه و یا style چون به طور کامل نمیتونید سفارشی سازی رو انجام بدید

چهارم تغییر دلخواه آیکون ها ، محل قرار گیری و Tooltip شش کنترل اصلی فرم (colse,minimize,maximize,border,dragmove,Resizer )