Pues eso… si aún trabajas con proyectos que utilizan ASP.NET con Webforms, es decir páginas ASPX, debes tener Visual Studio 2019 instalado y con las opciones adecuadas, ya que Visual Studio 2022 solo utiliza ASP:NET Core y no podrás crear «amigablemente» nuevas páginas ASPX en el proyecto, entre otras cosas porque no están en el SDK de .NET, si no en el de .NET Framework.
Si no tienes Visual Studio 2019 instalado, puedes entrar en esta página para descargarlo.
Si ya lo tienes instalado, asegúrate que tienes estas opciones seleccionadas: (ver figura 1)
De esta forma podrás crear nuevas páginas ASPX (WebForms) o cualquier otro tipo que puedas usar con ASP.NET para .NET Framework.
Espero que te haya sido de utilidad.
Ya sabes, si quieres, puedes hacer un donativo «al blog del Guille» 😉
Pues eso… que estuve un tiempo buscando soluciones para que se mostrasen mis aplicaciones en el monitor secundario (que es el que uso como principal) y resulta que la solución es más simple que todo eso… sí, solo con indicarle que se centre en la pantalla (CenterScreen) es suficiente
Y esto vale tanto para aplicaciones de Windows Forms como para las de WPF (Windows Presentation Foundation).
En WPF lo haces con este código en el diseñador de la ventana (Window):
WindowStartupLocation = "CenterScreen"
En WinForms asigna a la propiedad StartPosition del formulario de inicio el valor CenterScreen.
Pues eso… que el otro día te puse un ejemplo de Abrir y guardar archivos usando RichTextBox para WPF y anoche haciendo pruebas con vocales acentuadas, me di cuenta que el formato XAML (DataFormats.Xaml) las tildes se las pasaba por el forro… así que… buscando en la red de redes vi un ejemplo que evita eso… o casi, al menos te permite tener la opción de poder hacerlo.
El problema está (o estaba) en que en el ejemplo de donde saqué el código para guardarlo utiliza esto para crear el Stream de salida: Using fStream As New FileStream(_fileName, FileMode.Create) y usando FileStream no se puede indicar la codificación. O yo no sé cómo hacerlo, que todo hay que decirlo
Al abrir el Stream se hace la llamada al método Save del rango (TextRange) y se indica el formato con el que se guardará: range.Save(fStream, formato, True). range.Save precisa de un Stream, pero el ofrecido por StreamWriter, que es el que yo suelo usar para guardar indicando la codificación, no le sirve.
El truco está en guardar primero el contenido del RichTextBox en la memoria (usando MemoryStream) y después pasar ese flujo de caracteres al disco por medio de StreamWriter.
El código final quedaría de la siguiente forma:
'''<summary>
''' Adaptado del ejemplo de la documentación de Microsoft
''' https://docs.microsoft.com/es-es/dotnet/framework/wpf/controls/
''' richtextbox-overview
'''</summary>
PrivateFunction SaveRtfFormat(_fileName AsString,
richTB As RichTextBox,
formato AsString) AsBoolean
Dim range As TextRange
Dim guardado AsBoolean = False
range = New TextRange(richTB.Document.ContentStart,
richTB.Document.ContentEnd)
' Para guardar con el formato que queramos
' Adaptado de:
' https://social.msdn.microsoft.com/Forums/vstudio/en-US/
' a9ef25ef-fada-4cbd-a341-f9eb22fb2f48/
' how-to-save-a-rich-text-into-a-sql-server-database-in-a-wpf-application?forum=wpf
Using stream AsNew MemoryStream
Try
range.Save(stream, formato, True)
Dim buffer = Encoding.UTF8.GetString(stream.ToArray())
Using sw AsNew StreamWriter(_fileName, False, Encoding.Default)
sw.Write(buffer)
EndUsing
guardado = True
Catch ex As Exception
MessageBox.Show("Error el formato no es válido" & vbCrLf &
ex.Message,
$"Guardar {formato}",
MessageBoxButton.OK,
MessageBoxImage.Asterisk)
EndTry
EndUsing
'Using fStream As New FileStream(_fileName, FileMode.Create)
' Try
' range.Save(fStream, formato, True)
' guardado = True
' Catch ex As Exception
' MessageBox.Show("Error el formato no es válido" & vbCrLf &
' ex.Message,
' $"Guardar {formato}",
' MessageBoxButton.OK,
' MessageBoxImage.Asterisk)
' End Try
' fStream.Close()
'End Using
Return guardado
EndFunction
Al final de la función tienes (comentado) el código anterior.
///<summary>
/// Adaptado del ejemplo de la documentación de Microsoft
/// https://docs.microsoft.com/es-es/dotnet/framework/wpf/controls/
/// richtextbox-overview
///</summary>
privatebool SaveRtfFormat(string _fileName,
RichTextBox richTB,
string formato)
{
TextRange range;
bool guardado = false;
range = new TextRange(richTB.Document.ContentStart,
richTB.Document.ContentEnd);
// Para guardar con el formato que queramos
// Adaptado de:
// https://social.msdn.microsoft.com/Forums/vstudio/en-US/
// a9ef25ef-fada-4cbd-a341-f9eb22fb2f48/
// how-to-save-a-rich-text-into-a-sql-server-database-in-a-wpf-application?forum=wpf
using (MemoryStream stream = new MemoryStream())
{
try
{
range.Save(stream, formato, true);
var buffer = Encoding.UTF8.GetString(stream.ToArray());
using (StreamWriter sw = new StreamWriter(_fileName,
false,
Encoding.Default))
{
sw.Write(buffer);
}
guardado = true;
}
catch (Exception ex)
{
MessageBox.Show("Error el formato no es válido\r\n" +
ex.Message,
$"Guardar {formato}",
MessageBoxButton.OK,
MessageBoxImage.Asterisk);
}
}
// using (FileStream fStream = new FileStream(_fileName,
// FileMode.Create))
// {
// try
// {
// range.Save(fStream, formato);
// guardado = true;
// }
// catch (Exception ex)
// {
// MessageBox.Show("Error el formato no es válido\r\n" +
// ex.Message, $"Guardar {formato}",
// MessageBoxButton.OK, MessageBoxImage.Asterisk);
// }
// fStream.Close();
// }
return guardado;
}
Lo curioso del caso es que si lo guardaba como Rtf (DataFormats.Rtf) las vocales acentuadas se guardaban bien… Pero de esta forma, todo se guarda bien, al menos los tres formatos que he probado: Rtf, Xaml y Text.
Y es que en las pruebas que estaba haciendo usaba el código de ejemplo de la utilidad Compilar y ejecutar y tengo en varios sitios escrita la palabra versión y al guardarlo y después volver a abrirlo con formato Xaml, se mostraba como en la figura 1.
Al principio ni me fijé, pero cuando la ristra esa de caracteres raros se hizo más larga, ya que si me fijé
¡Como para no darme cuenta!
Y ya está… ahora modificaré la entrada anterior o pondré una aclaración para que vengas aquí (para que se vea que el Guille también se equivoca jajaja)